코딩테스트

[백준] 17144번 : 미세먼지 안녕! - 파이썬

청담동누룽이 2023. 4. 8. 22:52

아이디어 : 구현, 4방위 탐색, 배열 돌리기

 

나의 답안

import sys

input = sys.stdin.readline

R, C, T = map(int, input().split())
graph=[]
for _ in range(R):
    graph.append(list(map(int, input().split())))

for i in range(R):
    if graph[i][0] == -1:
        machine_up = i
        machine_down = i + 1
        break

dy = [1, 0, -1, 0]
dx = [0, -1, 0, 1]

def spread():
    global graph
    temp = [[0 for _ in range(C)] for _ in range(R)]
    for r in range(R):
        for c in range(C):
            spread_amount = 0
            if graph[r][c] == -1:
                continue
            for i in range(4):
                gr = r + dy[i]
                gc = c + dx[i]
                # 경계 & 공기 청정기
                if 0 <= gr < R and 0 <= gc < C and graph[gr][gc] != -1:
                    temp[gr][gc] = temp[gr][gc] + graph[r][c] // 5
                    spread_amount = spread_amount + graph[r][c] // 5
            temp[r][c] = temp[r][c] + (graph[r][c] - spread_amount)
    graph = temp[:]
    graph[machine_up][0] = -1
    graph[machine_down][0] = -1
    # DEBUG
    # print("spread")
    # for i in range(R):
    #     print(graph[i])
    return True

def spin():
    # 위 - 반시계
    prev_graph = graph[machine_up][1]
    graph[machine_up][1] = 0
    # 하
    for i in range(1, C-1):
        temp = graph[machine_up][i+1]
        graph[machine_up][i+1] = prev_graph
        prev_graph = temp  
    # 우
    for i in range(1, machine_up+1):
        temp = graph[machine_up - i][C-1]
        graph[machine_up - i][C-1] = prev_graph
        prev_graph = temp
    # 상
    for i in range(1, C):
        temp = graph[0][(C-1) - i]
        graph[0][(C-1) - i] = prev_graph
        prev_graph = temp 
    # 좌
    for i in range(1, machine_up):
        temp = graph[i][0]
        graph[i][0] = prev_graph
        prev_graph = temp
    # DEBUG
    # print("spin up")
    # for i in range(R):
    #     print(graph[i])

    # 아래 - 시계
    prev_graph = graph[machine_down][1]
    graph[machine_down][1] = 0
    # 상
    for i in range(1, C-1):
        temp = graph[machine_down][i+1]
        graph[machine_down][i+1] = prev_graph
        prev_graph = temp   
    # 우
    for i in range(machine_down+1, R):
        temp = graph[i][C-1]
        graph[i][C-1] = prev_graph
        prev_graph = temp
    # 하 - ?
    for i in range(1, C):
        temp = graph[R-1][(C-1) - i]
        graph[R-1][(C-1) - i] = prev_graph
        prev_graph = temp 
    # 좌
    for i in range(1, R-(machine_down+1)):
        temp = graph[(R-1) - i][0]
        graph[(R-1) - i][0] = prev_graph
        prev_graph = temp

    # DEBUG
    # print("spin down")
    # for i in range(R):
    #     print(graph[i])
    return True

def sum():
    sum = 0
    for i in range(R):
        for j in range(C):
            sum = sum + graph[i][j]
    sum = sum + 2
    return sum

def dust(T):
    while T :
        # logic
        spread()
        spin()
        T = T - 1

    return sum()

print(dust(T))

 

특별한 예외 케이스 없는 "구현(확산 로직) + 탐색 + 배열 돌리기" 로 이루어진 문제이다.

배열 돌리기 에서 경계값이 헷갈려서 시간이 좀 들었다.

좀 더 연습해야겠다 !