여름의 서재

[SWEA] 2382_미생물 격리 본문

알고리즘/SWEA

[SWEA] 2382_미생물 격리

엉아_ 2021. 12. 7. 10:39
728x90

📕 문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

💡 풀이법

1. 입력값을 리스트로 만들어서 micros 리스트에 담는다.

2. 먼저 1시간이 지났을때의 각각의 위치를 변경하고 만약 빨간 약품으로 넘어가면 방향과 미생물의 개수를 바꾼다.

3. 정사각형 셀과 크기가 같은 matrix 를 만든다.

4. micros를 돌면서 matrix의 해당 위치에 숫자를 넣어주고, 만약 같은 위치에 여러개의 군집이 있다면 cnt를 합해주고 미생물의 개수가 제일 큰 군집은 제외하고 나머지 군집의 번호를 remove_list에 더해준다. 

(이때, cnt가 0인 군집도 빼주기 위해 remove_list에 더한다)

5. 위의 for문이 끝나면 remove_list에 있는 군집을 micros에서 제거한다.

6. 위의 과정을 m번 돈다.

T = int(input())
dxy = [(-1,0), (1,0), (0,-1), (0,1)]
for tc in range(1, T+1):
    N, M, K = map(int, input().split())
    micros = []
    for _ in range(K):
        r, c, cnt, d = map(int, input().split())
        micros.append([r, c, cnt, d])
    
    for _ in range(M):
        for i in range(len(micros)):
            micros[i][0], micros[i][1] = micros[i][0] + dxy[micros[i][3]-1][0] , micros[i][1] + dxy[micros[i][3]-1][1]
            if micros[i][0] == 0 or micros[i][0] == N-1 or micros[i][1] == 0 or micros[i][1] == N-1:
                micros[i][2] = int(micros[i][2]/2)
                if micros[i][3] % 2:
                    micros[i][3] += 1
                else:
                    micros[i][3] -= 1

        matix = [[[0,0] for _ in range(N)] for _ in range(N)]
        remove_list = []
        for i in range(len(micros)):
            if micros[i][2] == 0:
                remove_list.append(i)
                continue
            cnt, idx = matix[micros[i][0]][micros[i][1]]
            if cnt == 0:
                matix[micros[i][0]][micros[i][1]] = [micros[i][2], i]
            else:
                if cnt > micros[i][2]:
                    micros[idx][2] += micros[i][2]
                    remove_list.append(i)
                else:
                    matix[micros[i][0]][micros[i][1]] = [micros[i][2], i]
                    micros[i][2] += micros[idx][2]
                    remove_list.append(idx)
        remove_list.sort()
        for i, n in enumerate(remove_list):
            del micros[n-i]
    total = 0
    for item in micros:
        total += item[2]
    print('#{} {}'.format(tc, total))
Comments