파이썬/파이썬 문제
dfs&bfs-(2)
백수진
2021. 8. 6. 19:04
1. 경쟁적 전염 => bfs 사용문제[8/6]
18405번: 경쟁적 전염
첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치
www.acmicpc.net
오답이유
1. 틀렸습니다 : 1-k까지의 바이러스의 종류가 있고 바이러스 개수는 k개로 정해진 것이 아닌데 한종류의 바이러스가 1번만 들어왔을때 체크하도록 코드를 작성하였음 => 다른 부분에서 error가 나는 줄 알고 계속 시도했다가 틀렸었고, 해당 이유를 찾을 수 있었던 testcase를 아래코드 밑에 넣어둠.
2. 출력초과 : list를 print해본 코드를 주석 혹은 삭제처리 하지 않았기 때문에 발생
3. 한 종류의 바이러스가 여러번 들어올 수 있기 때문에 종류(바이러스 번호)를 가지고 sort를 먼저함. 이후 sort된 list를 가지고 바이러스의 x,y좌표를 queue에 append할때 바이러스의 종류의 순서대로 넣어고 while을 돌려줌
#https://www.acmicpc.net/problem/18405
from collections import deque
#입력받기
n,k = map(int, input().split())
map_list = []
for i in range(0,n):
map_list.append(list(map(int,input().split())))
s,X,Y = map(int, input().split())
#x,y,바이러스번호를 기억할 queue를 생성
queue_x = deque()
queue_y = deque()
queue_num = deque()
def queue_append(x,y,num):
queue_x.append(x)
queue_y.append(y)
queue_num.append(num)
map_list[x][y]=num
def bfs(cnt,befor):
while queue_x:
x = queue_x.popleft()
y = queue_y.popleft()
num = queue_num.popleft()
#아래의 조건은 마지막 종류의 바이러스가 before을 줄인 befor에 넣어놓고 현재 바이러스가 1일때 1초를 더해주는 시간 계산코드
if befor==k and num==1:
cnt+=1
if cnt==s:
return
befor = num
#아래의 4개의 조건문은 상하좌우로 퍼져나가게끔 하는 코드
if x-1>=0 and map_list[x-1][y]==0:
queue_append(x-1,y, num)
if x+1<n and map_list[x+1][y]==0:
queue_append(x+1,y,num)
if y-1>=0 and map_list[x][y-1]==0:
queue_append(x,y-1,num)
if y+1<n and map_list[x][y+1]==0:
queue_append(x,y+1,num)
be_list=[]
#정렬을 위해 be_list를 사용
for i in range(0,n):
for j in range(0,n):
if map_list[i][j]!=0:
be_list.append([i,j,map_list[i][j]])
be_list.sort(key = lambda x:x[2])
for i in range(0,len(be_list)):
queue_x.append(be_list[i][0])
queue_y.append(be_list[i][1])
queue_num.append(be_list[i][2])
#위의 세개도 역시 queue_append()를 사용해서 나타낼 수도 있음
bfs(0,-1)
print(map_list[X-1][Y-1])
# '틀렸습니다'가 나왔던 이유를 알 수 있었던 testcase예제를 찾아봄
'''
5 2
1 0 0 0 2
0 0 1 0 0
2 0 0 0 0
0 0 0 0 0
0 0 0 0 1
3 3 3
'''