백준/Search

[bfs/백준] 18405번: 경쟁적 전염

ydin 2022. 5. 6. 17:43

-문제: https://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())
data=[]
virus=[]
dx=[-1,1,0,0]
dy=[0,0,-1,1]

for i in range(n):
    data.append(list(map(int,input().split())))
    for j in range(n):
        if data[i][j]!=0:
            virus.append((data[i][j],0,i,j))
virus.sort()
q=deque(virus)

target_s, target_x, target_y = map(int,input().split())

while q:
    germ, s, x, y = q.popleft()
    if s == target_s:
        break
    for i in range(4):
        for j in range(4):
            nx,ny=x+dx[i],y+dy[i]
            if 0<=nx<n and 0<=ny<n:
                if data[nx][ny]==0:
                    data[nx][ny]=germ
                    q.append((germ, s+1, nx, ny))
print(data[target_x -1][target_y -1])

 

-내가 시도한 풀이 

i번 바이러스에 대한 정보 담는 방법이 미흡했다

그리고 바이러스 순서대로 하면 겹칠 가능성 없다

from collections import deque
n,k=map(int,input().split())
data=[]
virus=[]
dx=[-1,1,0,0]
dy=[0,0,-1,1]

for i in range(n):
    data.append(list(map(int,input().split())))
    for j in range(n):
        for l in range(1,k+1):
            if data[i][j]==l :
                virus[l].append([i,j])
s,x,y=map(int,input().split())
def bfs(u,v,k,s):
    q=deque()
    q.append((u,v))
    time=0
    while q:
        if time ==s:
            break
        x,y= q.popleft()
        for i in range(4):
            nx,ny=x+dx[i],y+dy[i]
            if 0<=nx<n and 0<=ny<n:
                if data[nx][ny]==0 or data[x][y]<data[nx][ny]:
                    data[nx][ny]=k
                    q.append((nx,ny))
                else:
                    continue
        time+=1
for i in range(1,k+1):
    if len(virus[i]) !=0:
        a,b=virus[i]
        bfs(a,b,i,s)
        
print(data[x-1][y-1])