Algorithm/백준

[백준/Python] 특정 거리의 도시 찾기

poppy 2021. 7. 24. 22:37
반응형

https://www.acmicpc.net/problem/18352

 

18352번: 특정 거리의 도시 찾기

첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개

www.acmicpc.net

처음에 제출했을 때 시간 초과가 났다! 이유를 알아보니 파이썬은 input().split() 으로 입력하는 경우 입력량이 많기 때문에 시간 초과가 나는 것이었다... 시간 초과가 나지 않으려면 sys.stdin.readline() 을 사용해야 한다!

 

 

이 문제는 최단 거리를 찾는 문제로 너비 우선 탐색(BFS)을 이용하면 풀 수 있었다!

import sys
from collections import deque

input = sys.stdin.readline
# 입력 받는 부분 
n, m, k, x = map(int, input().split()) # 도시의 개수, 도로의 개수, 거리 정보, 출발 도시 번호

graph = [[] for _ in range(n+1)] # 연결된 도로 정보 리스트
for i in range(m):
	a, b = map(int, input().split())
	graph[a].append(b)

distance = [-1] * (n+1) # 도시에 대한 최단거리 리스트
queue = deque([x]) # 너비 우선 탐색을 위한 큐
distance[x] = 0 # 출발 도시의 거리는 0으로

# 너비 우선 탐색 수행
while queue:
	v = queue.popleft() # 현재 도시

    # 현재 도시에서 이동할 수 있는 모든 도시들을 확인
	for i in graph[v]:
		if distance[i] == -1: # 방문하지 않은 도시라면
			queue.append(i)
			distance[i] = distance[v] + 1 # 최단 거리 갱신

# 최단 거리가 k인 도시 번호 출력
city = False
for i in range(1, n+1):
	if distance[i] == k:
		print(i)
		city = True

# 최단 거리가 k인 도시가 없다면 -1 출력
if city == False:
	print(-1)

도시 번호가 1부터 시작하므로 도시번호와 리스트의 인덱스를 맞추기 위해 리스트는 n+1 까지 생성해준다. 너비 우선 탐색을 할 때는 deque를 사용한다. queue 가 없을 때까지 너비 우선 탐색을 수행한다. 현재 도시 정보를 queue 에서 가져와 현재 도시에서 이동할 수 있는 모든 도시들을 확인한다. 방문하지 않은 도시라면 최단 거리를 갱신한다. 너비 우선 탐색이 끝나면 최단 거리가 k인 도시번호를 출력하면 된다.

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준/Python] 하노이 탑 이동 순서  (0) 2021.08.14
[백준/Python] 별 찍기 - 10  (0) 2021.08.14
[백준/Python] 플로이드  (0) 2021.07.04
[백준/Python] 럭키 스트레이트  (0) 2021.05.14
[백준/Python] 카드 정렬하기  (0) 2021.05.08