17144. 미세먼지 안녕! 문제 바로가기
해결 방법
주요 과정
for _ in range(T)
안에서 1초동안 일어나는 일을 실행합니다.
이중 for문을 통해 미세먼지를 확산시킵니다.
이때 새로운 n_room에 확산을 저장해야 원하는 확산값을 얻을 수 있습니다. (확산을 room에 바로 하면 X)
cleanUp
함수를 통해 윗 방향, 아래방향으로 나눠서 각 방향별로 동작하도록 구현하였습니다.밑에 그림과 같이
- 윗쪽 공기청정기가 회색 화살표로 동작하기 위해서
시계 방향
(하늘색 화살표)으로 갱신하도록 하였다. - 아래쪽 공기청정기가 회색 화살표로 동작하기 위해서
반시계 방향
(주황색 화살표)으로 갱신하도록 하였다.
- 윗쪽 공기청정기가 회색 화살표로 동작하기 위해서
다음의 동작을 구현하기 위해 original 리스트에 위의 1초 동안 일어나는 과정을 after에 저장하고 모든 과정이 끝났을 때 original = deepcopy(after)
(또는 밑에 코드처럼 하나하나 복사해서 붙여넣기)로 다시 저장하고 이 과정을 T 시간 동안 반복합니다.
original : 미세먼지 확산시키고 공기청정기 작동하기 전을 저장하는 리스트
after : 미세먼지 확산시키고 공기청정기 작동한 뒤의 적용된 리스트
느낌점
런타임 에러(IndexError)로 이틀동안 뭐가 문제인지 못찾았습니다. 다음의 에러를 공기청정기 작동 부분에서 인덱스 에러가 난 줄 알았는데 공기청정기 위치를 행으로 탐색해야하는데 열로 탐색해서 였습니다.
→ 당연하게 맞다고 생각하는 것을 의심하는 습관을 길러야겠다! 기본 설정 코드도 중요하게 살펴보기!
구현한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
def clean_up(x, y, cleaner, d): # 위쪽 공기청정기의 바람을 동작할 함수
dir = [[-1, 0], [0, 1], [1, 0], [0, -1]] # 시계 방향으로 갱신하도록 하는 방향 순서
nx = x + dir[d][0]
ny = y + dir[d][1]
if after[nx][ny] == -1: # 공기청정기에 도달했기에 종료 조건
after[x][y] = 0
return
after[x][y] = after[nx][ny]
wall = [[0, 0], [0, C-1], [cleaner, C-1]]
if [nx, ny] in wall: # 방향을 바꿔야 하는 조건
d += 1
clean_up(nx, ny, cleaner, d)
def clean_down(x, y, cleaner, d): # 아래쪽 공기청정기의 바람을 동작할 함수
dir = [[1, 0], [0, 1], [-1, 0], [0, -1]] # 반시계 방향으로 갱신하도록 하는 방향 순서
nx = x + dir[d][0]
ny = y + dir[d][1]
if after[nx][ny] == -1: # 공기청정기에 도달했기에 종료 조건
after[x][y] = 0
return
after[x][y] = after[nx][ny]
wall = [[R-1, 0], [R-1, C-1], [cleaner, C-1]]
if [nx, ny] in wall: # 방향을 바꿔야 하는 조건
d += 1
clean_down(nx, ny, cleaner, d)
# 입력을 받는다.
R, C, T = map(int, input().split())
original = [list(map(int, input().split())) for _ in range(R)]
for r in range(R):
if original[r][0] == -1: # 공기 청전기 위치를 찾는다.
cleaner = r # 공기 청정기의 첫번째 행 인덱스 저장!
break
for t in range(T):
after = [[0]*C for _ in range(R)] # after : 확산이 일어난 상태를 저장할 리스트
# 공기청정기를 위치 저장한다.
after[r][0] = -1
after[r+1][0] = -1
# 1. 미세먼지 확산시키기
for x in range(R):
for y in range(C):
if original[x][y] > 0:
dir = [[-1, 0], [0, 1], [1, 0], [0, -1]]
num = int(original[x][y] / 5)
cnt = 0
for d in range(4):
nx = x + dir[d][0]
ny = y + dir[d][1]
if 0 <= nx < R and 0 <= ny < C and after[nx][ny] >= 0:
after[nx][ny] += num
cnt += 1
after[x][y] += original[x][y] - num * cnt
# 2. 공기청정기 작동시키기
clean_up(cleaner - 1, 0, cleaner, 0)
clean_down(cleaner + 2, 0, cleaner+1, 0)
for i in range(R):
for j in range(C):
original[i][j] = after[i][j]
dusts = 0
for x in range(R):
for y in range(C):
if original[x][y] > 0:
dusts += original[x][y]
print(dusts)