여름의 서재
[SWEA] 2382_미생물 격리 본문
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))
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA] 1767_프로세서 연결하기 (0) | 2021.10.20 |
---|---|
[SWEA] 1249_보급로 (다익스트라 이용) (0) | 2021.10.15 |
[SWEA] 1795_인수의 생일 파티 (다익스트라 이용) (0) | 2021.10.15 |
[SWEA] 7465_창용 마을 무리의 개수 (0) | 2021.10.15 |
[SWEA] 1251_하나로 (Prim 이용) (0) | 2021.10.14 |
Comments