본문 바로가기
Problem Solving/BOJ

[BOJ][Python]17144 풀이

by NoiB 2023. 11. 2.
반응형

https://www.acmicpc.net/problem/17144

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

import sys; ssr = sys.stdin.readline

def diffusion(ap_pos, r, c):
    result = [[0 for _ in range(c)] for _ in range(r)]
    dpos = [(1, 0), (-1, 0), (0, 1), (0, -1)]
    for cur_r in range(r):
        for cur_c in range(c):
            flag = 0
            if a[cur_r][cur_c] > 0:
                for dr, dc in dpos:
                    diffuse_r, diffuse_c = cur_r + dr, cur_c + dc
                    if 0 <= diffuse_r < r and 0 <= diffuse_c < c and a[diffuse_r][diffuse_c] != -1:
                        result[diffuse_r][diffuse_c] += a[cur_r][cur_c]//5
                        flag += 1
            result[cur_r][cur_c] += a[cur_r][cur_c] - a[cur_r][cur_c]//5*flag
    result[ap_pos[0]][0], result[ap_pos[1]][0] = -1, -1
    return result

def air_purifier(ap_pos, r, c):
    # up
    up_dpos = [(-1, 0), (0, 1), (1, 0), (0, -1)]
    up_pos = [ap_pos[0]-1, 0]
    cursor = 0
    while up_pos != [ap_pos[0], 0]:
        next_r, next_c = up_pos[0] + up_dpos[cursor][0], up_pos[1] + up_dpos[cursor][1]
        if 0 <= next_r <= ap_pos[0] and 0 <= next_c < c:
            a[up_pos[0]][up_pos[1]] = a[next_r][next_c]
            up_pos = [next_r, next_c]
        else:
            cursor += 1
    a[ap_pos[0]][1] = 0
    # down
    down_dpos = [(1, 0), (0, 1), (-1, 0), (0, -1)]
    down_pos = [ap_pos[1]+1, 0]
    cursor = 0
    while down_pos != [ap_pos[1], 0]:
        next_r, next_c = down_pos[0] + down_dpos[cursor][0], down_pos[1] + down_dpos[cursor][1]
        if ap_pos[1] <= next_r < r and 0 <= next_c < c:
            a[down_pos[0]][down_pos[1]] = a[next_r][next_c]
            down_pos = [next_r, next_c]
        else:
            cursor += 1
    a[ap_pos[1]][1] = 0
        
r, c, t = map(int, ssr().split())
a = [list(map(int, ssr().split())) for _ in range(r)]
ap_pos = []
for i in range(r):
    if a[i][0] == -1:
        ap_pos = [i, i+1]
        break
for _ in range(t):
    a = diffusion(ap_pos, r, c)
    air_purifier(ap_pos, r, c)
ans = 0
for i in range(r):
    for j in range(c):
        ans += a[i][j]
print(ans+2)

 

크게 어려운 문제는 아닌데 약간 주의하면 좋을 점이 미세먼지의 확산이 모든 칸에서 동시에 일어난다는 점공기 청정기의 위치가 [(2,0), (3,0)] 으로 고정된게 아니라는 점입니다. 문제 조건에 공기청정기의 위치가 2번 위아래로~ 하는 문장이 있는데다가 예제로 주어진 환경이 전부 2와 3행에 있다보니 넘겨 짚기 쉬운 부분인 것 같네요.

 

위의 두가지를 염두에 두고 문제를 풀면 막힐 부분이 없는 클래스 4의 마지막 문제라 약간은 허무하기도 하면서, 클래스 4의 여정을 마쳤습니다. 지나고보면 그 때는 왜 못했는지 이해도 안갈 정도로 편해진 알고리즘들이 많은게 대견하기도 하면서 어떤 부분이 이해가 안되어서 그렇게 오랫동안 정체되었는지 궁금하기도 합니다. 물론 지금으로서는 알 방법도 없지만요.

 

이제부터는 백준 보다는 다른 부분에 좀 더 집중을 해볼까 합니다. 백준 문제를 푸는 것은 여전히 도전이자 즐거운 취미입니다만, 이제는 다른 것들을 좀 더 하면서 눈에 보이는 부분을 다듬는 것이 낫지 않을까 하는 고민이 있네요. 백준 문제풀이를 전혀 하지 않겠다는 말은 아닙니다만, 지금처럼 정기적으로 풀이를 올릴지는 장담을 못하겠네요. 다음 포스팅의 주제가 무엇이다 기약할 수는 없지만 아마 백준 풀이가 아닌 다른 주제일 것이라 예상하면서 이만 글을 마칠까 합니다. 근시일내에 다른 포스팅으로 또 찾아뵙도록 하겠습니다.

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]1005 풀이  (0) 2023.11.24
[BOJ][Python]17070 풀이  (0) 2023.10.30
[BOJ][Python]15686 풀이  (0) 2023.10.27
[BOJ][Python]14938 풀이  (0) 2023.10.22