본문 바로가기
ALGORITHM/SW Expert Academy

[SWEA/Python] 2383. 미생물 격리

by 안녕나는현서 2021. 12. 7.
728x90

📌 문제

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

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

swexpertacademy.com

 

📌 문제 접근 방법

  1. 주어진 정보를 어떤 형식으로 저장하는 게 가장 쓰기 편할까? 이 고민을 제일 많이 했다.
    결국은 딕셔너리를 사용해서 좌표를 key로 미생물의 개수와 방향을 value로 저장했다.
  2. 그 다음 딕셔너리를 순회하며 temp라는 딕셔너리에 key값은 이동 후 좌표, value는 이동 전 좌표를 저장했다.
  3. 다시 temp를 순회하며 value 리스트의 길이가 2 이상일 경우 한 지점에 여러 미생물이 모이는 것이므로, 미생물의 수가 가장 큰 군집을 찾아서 방향을 설정해주고 모든 미생물의 수를 더해서 저장했다.
  4. temp의 key에 0이나 N-1이 있을 경우 약품을 만나게 되므로 미생물의 수를 2로 나눠주었다.
  5. 위의 시행을 M번 반복 후, 모든 미생물의 수를 더해서 출력해주었다.

 

📌 코드

# SWEA 2382 미생물 격리
from collections import defaultdict

T = int(input())

for t in range(1, T+1):
    N, M, K = map(int, input().split())
    group = {}
    dxy = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 상하좌우

    for _ in range(K):
        i, j, n, d = map(int, input().split())
        group[(i, j)] = [n, dxy[d-1]]

    for _ in range(M):
        temp = defaultdict(list)
        for place, info in group.items():
            temp[(place[0]+info[1][0], place[1]+info[1][1])].append((place[0], place[1]))
        
        after_move = {}
        for after, before in temp.items():
            if len(before) >= 2:
                max_n = 0
                total = 0
                way = (-1, -1)
                for b in before:
                    if group[b][0] > max_n:
                        max_n = group[b][0]
                        way = group[b][1]
                    
                    total += group[b][0]
                
                after_move[after] = [total, way]
            elif 0 in after or N-1 in after:
                after_move[after] = [group[before[0]][0]//2, (-group[before[0]][1][0], -group[before[0]][1][1])]
            else:
                after_move[after] = group[before[0]]

        group = after_move

    answer = 0
    for n, d in group.values():
        answer += n
    
    print('#{} {}'.format(t, answer))
728x90

댓글