bong-u/til

백준 - 17144 : 미세먼지 안녕! (G4)

수정일 : 2024-11-15

 1R, C, T = map(int, input().split())
 2L = [list(map(int, input().split())) for _ in range(R)]
 3
 4dx = [0, 1, 0, -1]
 5dy = [-1, 0, 1, 0]
 6dx2 = [0, 1, 0, -1]
 7dy2 = [1, 0, -1, 0]
 8
 9pur_a = (0, 0)
10pur_b = (0, 0)
11
12for i in range(R):
13    if L[i][0] == -1:
14        pur_a = (i, 0)
15        pur_b = (i+1, 0)
16        break
17
18def diffuse(L):
19    L_ = [[0]*C for _ in range(R)]
20
21    for i in range(R):
22        for j in range(C):
23            if L[i][j] > 0:
24                cnt = 0
25                for k in range(4):
26                    px = j+dx[k]
27                    py = i+dy[k]
28
29                    if 0 <= px < C and 0 <= py < R and L[py][px] != -1:
30                        L_[py][px] += L[i][j] // 5
31                        cnt += 1
32                L_[i][j] += L[i][j] - ((L[i][j] // 5)*cnt)
33
34    return L_
35
36def air_purify(L):
37    x = pur_a[1]
38    y = pur_a[0]
39    lastX = 0
40    lastY = 0
41    i = 0
42    while i < 4:
43        lastX = x
44        lastY = y
45        x += dx[i]
46        y += dy[i]
47
48        if not (0 <= x < C and 0 <= y < R) or (x, y) == (C-1, pur_a[0]+1):
49            x -= dx[i]
50            y -= dy[i]
51            lastX = x
52            lastY = y
53            i += 1
54            continue
55        if (x, y) == (pur_a[1], pur_a[0]):
56            L[pur_a[0]][pur_a[1]+1] = 0
57            L[pur_a[0]][pur_a[1]] = -1
58            break
59        L[lastY][lastX] = L[y][x]
60
61    x = pur_b[1]
62    y = pur_b[0]
63    i = 0
64    while i < 4:
65        lastX = x
66        lastY = y
67        x += dx2[i]
68        y += dy2[i]
69
70        if not (0 <= x < C and 0 <= y < R) or (x, y) == (C-1, pur_b[0]-1):
71            x -= dx2[i]
72            y -= dy2[i]
73            lastX = x
74            lastY = y
75            i += 1
76            continue
77        if (x, y) == (pur_b[1], pur_b[0]):
78            L[pur_b[0]][pur_b[1]+1] = 0
79            L[pur_b[0]][pur_b[1]] = -1
80            break
81        L[lastY][lastX] = L[y][x]
82
83for i in range(T):
84    L = diffuse(L)
85    air_purify(L)
86
87result = 0
88for i in L:
89    for j in i:
90        if j != -1:
91            result += j
92print (result)

고찰

  • 구현/시뮬레이션 문제이다
  • 혼자 풀긴했다
  • 구현 문제는 항상 푸는데 시간이 오래걸린다는 생각이 든다

시간을 잡아먹었던 부분

  1. 미세먼지가 확산되는 부분
    • 인접한 두 곳에 미세먼지가 존재할때 중복되는 것에 대한 처리를 어떻게 해야할지 고민했다
    • 새로운 배열에 더하는 방식으로 해결했다
  2. 공기청정기로부터 바람이 시계방향, 반시계방향으로 도는 것에 대한 부분
    • lastX, lastY라는 변수를 만들어 이전에 있었던 인덱스를 저장한뒤 현재 값을 이전의 공간에 대입한다
    • 이를 위해 순회를 반대방향으로 해야한다 (시계->반시계, 반시계->시계)