[Baekjoon] 18352. 특정 거리의 도시 찾기

2022. 12. 29. 15:08·코딩테스트/Python
728x90
반응형

🔗 Problem Link

 

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


❔Thinking

  • 도시의 개수, 도로의 개수, 출발 도시의 번호가 주어질 때, 최단 거리가 k인 도시를 모두 출력한다.

💻Solution

1. BFS를 활용한 풀이

from collections import deque
import sys
input = sys.stdin.readline

n, m, k, x = map(int, input().split())
graph = [[] for _ in range(n+1)]
visited = [False] * (n+1)
result = []
dist = 1

for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)

q = deque([x])
tmp_cnt = len(q)
while q:
    if tmp_cnt == 0:
        tmp_cnt = len(q)
        dist += 1
    now = q.popleft()
    visited[now] = True
    tmp_cnt -= 1
    for i in graph[now]:
        if visited[i] is False:
            visited[i] = True
            q.append(i)
            if dist == k: 
                result.append(i)
    if dist > k:
        break

if result:
    result.sort()
    for r in result:
        print(r)
else:
    print(-1)

 

2. Dijkstra를 활용한 풀이

import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)

n, m, k, x = map(int, input().split())
graph = [[] for i in range(n+1)]
visited = [False] * (n+1)
distance = [INF] * (n+1)
result = []

for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append((b, 1))


q = []
heapq.heappush(q, (0, x))
distance[x] = 0
while q:
    dist, now = heapq.heappop(q)
    if distance[now] < dist:
        continue
    if dist == k:
        result.append(now)
    for i in graph[now]:
        cost = dist + i[1]
        if cost < distance[i[0]]:
            distance[i[0]] = cost
            heapq.heappush(q, (cost, i[0]))

if result:
    print('\n'.join(map(str, result)))
else:
    print(-1)

🗝️keypoint

  1. BFS를 활용할 경우, 거리(dist)를 1씩 증가하면서 거리가 k인 도시들을 result에 담고 BFS를 중단한다.
  2. 다익스트라 알고리즘은, 특정 위치에서 다른 모든 위치의 거리를 구하는 알고리즘이다.
  3. 입력받는 도로의 개수가 최대 1,000,000개 이므로, input이 아닌 sys.stdin.readline을 이용해야 시간을 줄일 수 있다.
저작자표시 (새창열림)

'코딩테스트 > Python' 카테고리의 다른 글

[Programmers] Level 2. 문자열 압축  (0) 2023.01.05
[Baekjoon] 1932. 정수 삼각형  (0) 2023.01.03
[Programmers] Level 2. 두 큐 합 같게 만들기  (0) 2022.12.26
[Leetcode] 77. Combinations  (0) 2022.12.02
[Leetcode] 46. Permutations  (0) 2022.12.02
'코딩테스트/Python' 카테고리의 다른 글
  • [Programmers] Level 2. 문자열 압축
  • [Baekjoon] 1932. 정수 삼각형
  • [Programmers] Level 2. 두 큐 합 같게 만들기
  • [Leetcode] 77. Combinations
swwho
swwho
일상을 데이터화하다
  • swwho
    하루한장
    swwho
  • 전체
    오늘
    어제
    • 분류 전체보기 (188)
      • ML_DL (39)
        • MUJAKJUNG (무작정 시리즈) (18)
        • 딥러닝 공부하기 (21)
      • 데이터사이언스 (1)
        • EDA (1)
        • 데이터과학을 위한 통계 (0)
      • 데이터엔지니어링 (2)
      • 논문리뷰 (2)
        • Computer Vision (2)
      • Python 활용하기 (12)
      • 코딩테스트 (127)
        • Python (109)
        • MySQL (14)
      • Git (3)
      • MySQL 활용하기 (0)
      • 일상 이야기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
swwho
[Baekjoon] 18352. 특정 거리의 도시 찾기
상단으로

티스토리툴바