[ BOJ / Python ] 18405번 경쟁적 전염

황승환·2022년 5월 13일
0

Python

목록 보기
300/498


이번 문제는 각 숫자의 위치를 deque로 저장한 리스트로 관리하고, BFS를 통해 주변을 탐색하며 0인 경우에 자신으로 숫자를 바꿔주는 방식을 사용하였다. 이때 각 숫자의 모든 위치를 계속해서 deque에 담으면 탐색의 크기가 커지기 때문에 새로 값을 입력한 값들만 deque에 담기도록 코드를 작성하였다. 한번 퍼트린 자리에서는 더 이상 퍼트릴 자리가 없는 것을 이용하였다.

Code

import collections
n, k=map(int, input().split())
grid=[list(map(int, input().split())) for _ in range(n)]
s, y, x=map(int, input().split())
y, x=y-1, x-1
viruses=[collections.deque() for _ in range(k+1)]
for i in range(n):
    for j in range(n):
        if grid[i][j]!=0:
            viruses[grid[i][j]].append((i, j))
def bfs():
    dy, dx=[0, 1, 0, -1], [1, 0, -1, 0]
    for i in range(1, k+1):
        new_q=collections.deque()
        while viruses[i]:
            y, x=viruses[i].popleft()
            for j in range(4):
                ny, nx=y+dy[j], x+dx[j]
                if 0<=ny<n and 0<=nx<n and grid[ny][nx]==0:
                    grid[ny][nx]=grid[y][x]
                    new_q.append((ny, nx))
        viruses[i]=new_q
for i in range(s):
    bfs()
print(grid[y][x])

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

0개의 댓글