TIL - 프로그래밍/Python 알고리즘
[백준] 18405. 경쟁적 전염 - Python (BFS 사용 X)
chaemj97
2023. 3. 23. 22:37
728x90
https://www.acmicpc.net/problem/18405
18405번: 경쟁적 전염
첫째 줄에 자연수 N, K가 공백을 기준으로 구분되어 주어진다. (1 ≤ N ≤ 200, 1 ≤ K ≤ 1,000) 둘째 줄부터 N개의 줄에 걸쳐서 시험관의 정보가 주어진다. 각 행은 N개의 원소로 구성되며, 해당 위치
www.acmicpc.net
- 접근법
- (X,Y)에 바이러스 i가 전염되었다 == 바이러스 i가 (X,Y)에 가장 먼저 도착하였다.
- 그러므로, S초 후 (X,Y)에 존재하는 바이러스 == S초 이내에 가장 먼저 도착한 바이러스 i
- 바이러스 i와 (X,Y)와의 거리를 각각 구한 후 거리가 S 이내이면서
- 거리가 가장 가깝고 바이러스 번호가 가장 작은 것이 답
- 코드
import sys
input = sys.stdin.readline
# 시험관의 크기, 바이러스 종류
N,K = map(int,input().split())
# 시험관
arr = [list(map(int,input().split())) for _ in range(N)]
# S초 후 (X,Y)에 존재하는 바이러스 종류 찾기
S,X,Y = map(int,input().split())
# 바이러스와 (X,Y)의 거리 최소
virus_d = [float('inf') for _ in range(K+1)]
# 바이러스와의 거리 체크
for r in range(N):
for c in range(N):
if arr[r][c] != 0:
virus_d[arr[r][c]] = min(virus_d[arr[r][c]],abs(r-(X-1))+abs(c-(Y-1)))
answer = sorted([[i,v] for i,v in enumerate(virus_d)],key=lambda x:(x[1],x[0]))
# S초 안에 도착할 수 있는 바이러스 번호
answer = []
for idx, d in enumerate(virus_d):
# S초 안에 전염될 수 있는가?
if d <= S:
answer.append([idx,d])
# S초 안에 전염될 수 있으면서 바이러스 번호가 가장 낮은 것이 답
answer.sort(key=lambda x:(x[1],x[0]))
# 어떤 바이러스도 S초 이내에 도달할 수 없다면 0
if not answer:
print(0)
else:
print(answer[0][0])
728x90
반응형