[파이썬] 백준 연구소3 : 17142 (골드3)
17142번: 연구소 3
인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 바이러스는 활성 상태와 비활성 상태가 있다. 가장 처음에 모든 바이러스는 비활성 상태이고,
www.acmicpc.net
문제
풀이
0. 방향성 생각
완탐 + BFS
1. 입력
from itertools import combinations as C
from collections import deque
import sys
input = lambda: sys.stdin.readline().rstrip()
N,M = map(int,input().split())
arr = [list(map(int,input().split())) for i in range(N)]
a = set()
virus = set()
for i in range(N):
a.update(arr[i])
for j in range(N):
if arr[i][j] == 2:
virus.add((j,i))
마지막 테스트 케이스 같은 경우 (빈칸이 없는 경우) 0 출력해야함.
이를 잡기위해 집합 a 정의하고 계속 업데이트
virus에는 바이러스 위치 구하기
2. BFS 함수 정의
def bfs(array,act_virus):
visit = [[-1]*N for _ in range(N)]
q = deque()
for a,b in act_virus:
q.append((a,b))
visit[b][a] = 0
while q:
x,y = q.popleft()
for i in range(4):
nx = x + step[0][i]
ny = y + step[1][i]
if 0<=nx<N and 0<=ny<N :
if array[ny][nx] != 1 and visit[ny][nx] == -1:
visit[ny][nx] = visit[y][x] + 1
q.append((nx,ny))
time = 0
for i in range(N):
for j in range(N):
if visit[i][j] == -1 and array[i][j] == 0 :
return -1
if time < visit[i][j] and array[i][j] == 0:
time = visit[i][j]
return time
이전 연구소 2와 비슷한 방식으로 진행.
방문 안했고 벽이 아닌 경우에 방문처리 + 도달거리 업데이트
visit 순회하면서 빈공간인데 방문처리 못했으면 return -1
visit 순회하면서 현재 최대 시간이 visit보다 작고 그게 빈칸인 경우 time 업데이트
3. 출력
if 0 not in a:
print(0)
else :
answer = []
for act in activation:
temp = [row[:] for row in arr]
answer.append(bfs(temp,act))
if set(answer) == set([-1]) : print(-1)
else : print(min([i for i in answer if i != -1]))
0 없으면 0 출력
아닌 경우에는 BFS 실행.
정답에 -1 만 있는 경우 (모두 실패) -1 출력, 아닌 경우는 -1 제외 가장 작은 값 출력
전체코드
from itertools import combinations as C
from collections import deque
import sys
input = lambda: sys.stdin.readline().rstrip()
N,M = map(int,input().split())
arr = [list(map(int,input().split())) for i in range(N)]
a = set()
virus = set()
for i in range(N):
a.update(arr[i])
for j in range(N):
if arr[i][j] == 2:
virus.add((j,i))
activation = list(C(virus,min(M,len(virus))))
step = [[1,-1,0,0],[0,0,1,-1]]
def bfs(array,act_virus):
visit = [[-1]*N for _ in range(N)]
q = deque()
for a,b in act_virus:
q.append((a,b))
visit[b][a] = 0
while q:
x,y = q.popleft()
for i in range(4):
nx = x + step[0][i]
ny = y + step[1][i]
if 0<=nx<N and 0<=ny<N :
if array[ny][nx] != 1 and visit[ny][nx] == -1:
visit[ny][nx] = visit[y][x] + 1
q.append((nx,ny))
time = 0
for i in range(N):
for j in range(N):
if visit[i][j] == -1 and array[i][j] == 0 :
return -1
if time < visit[i][j] and array[i][j] == 0:
time = visit[i][j]
return time
if 0 not in a:
print(0)
else :
answer = []
for act in activation:
temp = [row[:] for row in arr]
answer.append(bfs(temp,act))
if set(answer) == set([-1]) : print(-1)
else : print(min([i for i in answer if i != -1]))
코멘트
빈칸 0 없으면 0 출력인데 -1 해놓고 삽질함
코드 복붙해서 대충 날먹하는거보다 조건 확인하면서 첨부터 짜는게 빠른듯
'Algorithm > Graph' 카테고리의 다른 글
[파이썬] 백준 1525 : 퍼즐 (골드2) (0) | 2023.07.30 |
---|---|
[파이썬] 프로그래머스 : 단어 변환 (Lv.2) (0) | 2023.07.20 |
[파이썬] 백준 3184, 3187 : 양, 양치기 꿍 (실버1) (0) | 2023.07.13 |
[파이썬] 백준 17141 : 연구소2 (골드4) (0) | 2023.07.12 |
[파이썬] 백준 14502 : 연구소 (골드4) (0) | 2023.07.11 |
[파이썬] 프로그래머스 : 미로탈출 (Lv.2) (0) | 2023.07.07 |
[파이썬] 프로그래머스 : 광물캐기 (Lv.2) (0) | 2023.07.07 |
댓글