728x90
📌 문제
https://swexpertacademy.com/main/main.do
📌 문제 접근 방법
- 주어진 정보를 어떤 형식으로 저장하는 게 가장 쓰기 편할까? 이 고민을 제일 많이 했다.
결국은 딕셔너리를 사용해서 좌표를 key로 미생물의 개수와 방향을 value로 저장했다. - 그 다음 딕셔너리를 순회하며 temp라는 딕셔너리에 key값은 이동 후 좌표, value는 이동 전 좌표를 저장했다.
- 다시 temp를 순회하며 value 리스트의 길이가 2 이상일 경우 한 지점에 여러 미생물이 모이는 것이므로, 미생물의 수가 가장 큰 군집을 찾아서 방향을 설정해주고 모든 미생물의 수를 더해서 저장했다.
- temp의 key에 0이나 N-1이 있을 경우 약품을 만나게 되므로 미생물의 수를 2로 나눠주었다.
- 위의 시행을 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
'ALGORITHM > SW Expert Academy' 카테고리의 다른 글
[SWEA/Python] 5658. 보물상자 비밀번호 (0) | 2021.12.07 |
---|---|
[SWEA/Python] 2383. 점심 식사시간 (0) | 2021.12.07 |
[SWEA/Python] 1795. 인수의 생일 파티 (0) | 2021.10.19 |
[SWEA/Python] 1249. 보급로 (0) | 2021.10.19 |
[SWEA/Python] 7465. 창용 마을 무리의 개수 (0) | 2021.10.15 |
댓글