백준/ Gold 4 문제 , 백준 파이썬 17142 , 연구소 2 [BFS]
Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감
1. 최상
2. 상
3. 중
4. 하
<이해도>
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
<덧붙일 말>
문제 출처
https://www.acmicpc.net/problem/17141
풀이
난 연구소 3를 먼저 풀어가지고 쉽게 풀렸다.
풀이는 연구소 3와 거의 비슷하다.
풀이의 37~42 라인만 문제에 맞게 바꿔주며, 이 풀이에서는 check 변수를 사용하지 않는다.
정답
from collections import deque
from copy import deepcopy
import sys
input=sys.stdin.readline
from itertools import combinations
vertical=[1,-1,0,0]
parallel=[0,0,1,-1]
N,M=map(int,input().split())
MAP=[list(map(int,input().split())) for _ in range(N)]
dq=deque()
def bfs(LIST,MAP):
cnt=0
virusMAP=deepcopy(MAP)
for i in range(len(LIST)):
dq.append(LIST[i])
virusMAP[LIST[i][0]][LIST[i][1]]=1
while dq:
x,y=dq.popleft()
for i in range(4):
X,Y=x+vertical[i], y+parallel[i]
if 0<=X<N and 0<=Y<N:
if virusMAP[X][Y]==0:
dq.append([X,Y])
virusMAP[X][Y]=virusMAP[x][y]+1
if cnt<virusMAP[X][Y]:
cnt=virusMAP[X][Y]
for i in range(N):
for j in range(N):
if virusMAP[i][j]==0:
cnt=-1
return cnt
virus=[]
for i in range(N):
for j in range(N):
if MAP[i][j]==2:
virus.append([i,j])
MAP[i][j]=0
result=[]
LIST=list(combinations(virus,M))
for i in range(len(LIST)):
result.append(bfs(LIST[i], MAP))
if len(result)==1 and result==[0]:
print(0)
else:
remove_set={-1}
if -1 in result:
result=[i for i in result if i not in remove_set]
if len(result)==0:
print(-1)
exit(0)
print(min(result)-1)
반응형
'알고리즘 공부 > 백준 - 파이썬' 카테고리의 다른 글
백준/ Bronze 3 문제 , 백준 파이썬 4470 , 줄번호 (0) | 2022.08.02 |
---|---|
백준/ Bronze 3 문제 , 백준 파이썬 5524 , 입실 관리 (0) | 2022.08.02 |
백준/ Gold 4 문제 , 백준 파이썬 17142 , 연구소 3 [BFS] (0) | 2022.07.29 |
백준/ Bronze 1 문제 , 백준 파이썬 11655 , ROT13 (0) | 2022.07.29 |
백준/ Silver 1 문제 , 백준 파이썬 1743 , 음식물 피하기 [BFS] (0) | 2022.07.29 |