알고리즘 문제풀이/백준

[백준 18405] 경쟁적 전염

taemin 2021. 5. 12.

www.acmicpc.net/problem/18405

 

18405번: 경쟁적 전염

첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치

www.acmicpc.net

from collections import deque

N,K = map(int,input().split())
mat = [list(map(int,input().split())) for i in range(N)]
S,X,Y = map(int,input().split())
dx=[0,0,1,-1]
dy=[1,-1,0,0]
start = [] # 바이러스 종류, x,y좌표

for i in range(N):
    for j in range(N):
        if mat[i][j] != 0:
            start.append([mat[i][j],i,j])

start.sort()

visited = [[0 for i in range(N)] for j in range(N)]
for i in start:
    kind,tx,ty = i
    visited[tx][ty] = kind
q = deque(start)

cnt=0
while q:
    q_size = len(q)
    cnt+=1
    if cnt == S+1:
        break
    for _ in range(q_size):
        kind,tx,ty = q.popleft()

        for i in range(4):
            nx = tx+dx[i]
            ny = ty+dy[i]

            if nx<0 or nx == N or ny<0 or ny == N:
                continue
            if not visited[nx][ny]:
                visited[nx][ny] = kind
                q.append([kind,nx,ny])

print(visited[X-1][Y-1])

풀이

특별할게 없는 전형적인 bfs 풀이이다.

 

바이러스가 오름차순 순서대로 bfs 돌아야 하기 때문에 첫 배열에서 찾은 바이러스들을 오름차순으로 정렬해서 q에 넣어준다.

 

S번만 돌아야 하기 때문에 q_size를 측정해서 bfs 레벨을 체크해준다.

 

시간복잡도

N*N 배열이라고 할 때,

S에 따라 조금 다르겠지만 거의 모든칸을 방문하므로 O(N^2)이라 볼 수 있다.

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 12851] 숨바꼭질 2 파이썬  (0) 2021.05.13
[백준 1034] 램프  (0) 2021.05.12
[백준 1027] 고층 건물  (0) 2021.05.12
[백준 1004] 어린왕자  (0) 2021.05.12
[백준 15954] 인형들  (0) 2021.05.11

댓글