Posts [baekjoon] 17144. 미세먼지 안녕! (python)
Post
Cancel

[baekjoon] 17144. 미세먼지 안녕! (python)

17144. 미세먼지 안녕! 문제 바로가기

해결 방법

주요 과정

for _ in range(T) 안에서 1초동안 일어나는 일을 실행합니다.

  1. 이중 for문을 통해 미세먼지를 확산시킵니다.

    이때 새로운 n_room에 확산을 저장해야 원하는 확산값을 얻을 수 있습니다. (확산을 room에 바로 하면 X)

  2. 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)
This post is licensed under CC BY 4.0 by the author.

[baekjoon] 20061. 모노미노도미노2 (python)

[baekjoon] 16236. 아기상어 (python)

Comments powered by Disqus.