[ BOJ / Python ] 17144번 미세먼지 안녕!

황승환·2022년 3월 2일
0

Python

목록 보기
213/498


이번 문제는 문제에서 주어진 내용대로 구현을 하는 문제이다. 미세먼지가 퍼지는 함수를 작성하고, 공기청정기가 한바퀴 도는 함수를 작성하였다. 혼자 힘으로 코드를 작성하다가 막히는 부분들이 조금 존재하여 다른 사람의 코드를 참고하였다.

미세먼지가 퍼지는 함수는 동서남북 방향으로 가능한지 확인한 후, 가능한 경우에만 퍼지도록 하였고 기존 그래프가 아닌 새로운 그래프에 변경 사항을 갱신하도록 하였다. 가능한 경우 새로운 그래프의 해당 인덱스에 기존 그래프의 값을 5로 나눈 값을 더하였고, 새로운 그래프의 현재 인덱스를 미세먼지가 퍼지고 난 수로 갱신하였다.

공기청정기가 한바퀴 도는 함수는 총 8개의 for문을 사용하였다. 먼저 위의 공기청정기에 해당하는 반시계방향으로의 회전을 작성하였고, 아래 공기청정기에 해당하는 시계방향으로의 회전을 작성하였다. 그리고 공기청정기의 바로 오른쪽 인덱스는 무조건 0이 나오므로 0으로 갱신해주었다.

Code

def spread():
    for x in range(r):
        for y in range(c):
            if board[x][y] > 0:
                cnt = 0
                for i in range(4):
                    nx, ny = x+dx[i], y+dy[i]
                    if not(0<=nx<r and 0<=ny<c): continue
                    if board[x][y]<5:continue
                    if (nx, ny)==(cleaner[0], 0): continue
                    if (nx, ny)==(cleaner[1], 0): continue
                    cnt+=1
                    board2[nx][ny]+=board[x][y]//5
                board2[x][y]+=(board[x][y]-board[x][y]//5*cnt)
def cleaning():
    for i in range(cleaner[0]-2, -1, -1):
        board2[i+1][0] = board2[i][0]
    for i in range(1, c):
        board2[0][i-1] = board2[0][i]
    for i in range(1, cleaner[0]+1):
        board2[i-1][-1] = board2[i][-1]
    for i in range(c-2, 0, -1):
        board2[cleaner[0]][i+1] = board2[cleaner[0]][i]
    board2[cleaner[0]][1] = 0
    for i in range(cleaner[1]+2, r):
        board2[i-1][0] = board2[i][0]
    for i in range(1, c):
        board2[-1][i-1] = board2[-1][i]
    for i in range(r-2, cleaner[1]-1, -1):
        board2[i+1][-1] = board2[i][-1]
    for i in range(c-2, 0, -1):
        board2[cleaner[1]][i+1] = board2[cleaner[1]][i]
    board2[cleaner[1]][1] = 0
r, c, t = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(r)]
cleaner = []
for i in range(r):
    if board[i][0] == -1:
        cleaner.append(i)
dx = (0, 0, -1, 1)
dy = (-1, 1, 0, 0)
board2 = [[0]*c for _ in range(r)]
spread()
cleaning()
for time in range(t-1):
    board = board2.copy()
    board2 = [[0]*c for _ in range(r)]
    spread()
    cleaning()
answer = 0
for i in range(r):
    for j in range(c):
        if board2[i][j] > 0:
            answer+=board2[i][j]
print(answer)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글