알고리즘 문제풀이

백준 - 특정 거리의 도시 찾기 18352(Python)

2023. 3. 1. 17:22
목차
  1. 문제설명
  2. 입력
  3. 출력
  4. 예제입력 / 예제출력
  5. 문제이해 및 코드설명
  6. 코드
반응형
[Silver II] 특정 거리의 도시 찾기 - 18352
https://www..naver.com

 

문제설명

어떤 나라에는 1번부터 N번까지의 도시와 M개의 단방향 도로가 존재한다. 모든 도로의 거리는 1이다.

이 때 특정한 도시 X로부터 출발하여 도달할 수 있는 모든 도시 중에서, 최단 거리가 정확히 K인 모든 도시들의 번호를 출력하는 프로그램을 작성하시오. 또한 출발 도시 X에서 출발 도시 X로 가는 최단 거리는 항상 0이라고 가정한다.

예를 들어 N=4, K=2, X=1일 때 다음과 같이 그래프가 구성되어 있다고 가정하자.

이 때 1번 도시에서 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 2인 도시는 4번 도시 뿐이다.  2번과 3번 도시의 경우, 최단 거리가 1이기 때문에 출력하지 않는다.

 

입력

첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개의 자연수 A, B가 공백을 기준으로 구분되어 주어진다. 이는 A번 도시에서 B번 도시로 이동하는 단방향 도로가 존재한다는 의미다. (1 ≤ A, B ≤ N) 단, A와 B는 서로 다른 자연수이다.

 

출력

X로부터 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 K인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력한다.

이 때 도달할 수 있는 도시 중에서, 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1을 출력한다.

 

 

예제입력 / 예제출력

 

문제이해 및 코드설명

문제에서 제시한 거리정보인 도시를 하나씩 출력하는 문제이다.

해당 문제를 풀기 위해선 거리정보를 구한후 최단 거리정보를 갱신해주는 과정이 필요하다.

최단거리를 구하는 문제이고 모든 간선사이의 길이가 1 롤 고정되어있다보니 bfs를 사용하는게 가장 이득일것이라 판단해서 문제를 해결해보고자 하였다. 만약 간선사이의 길이가 서로 다르다면 bfs가 아니라 다익스트라의 방식을, 간선정보도 다르고 음의 간선도 섞여있는 문제라고 생각한다면 벨만 포드 알고리즘을 고려해봐야할듯하다.

 

문제를 풀면서 어느 시점에 어떤알고리즘을 적용하는가가 애매하고 아직 개념정립이 잘 되진 않은것같음을 느꼈다.

여러 문제를 풀어보면서 상황에따라 잘 적응시키는 노력이 필요할듯하다.

 

코드

import sys
from collections import deque

# 도시 수 N, 도로 수 M, 거리정보 K, 출발도시 X
N,M,K,X = map(int,sys.stdin.readline().split())

graph = [[] for _ in range(N+1)]

for _ in range(M):
    a, b = map(int,sys.stdin.readline().split())
    graph[a].append(b)

distance = [-1] * (N+1)
distance[X] = 0

q = deque([X])
while q:
    now = q.popleft()

    for next in graph[now]:
        if distance[next]== -1:
            distance[next] = distance[now]+1
            q.append(next)

# K값이 distance에 없다면 i값 -1 출력
if K in distance:
    for i in range(1,N+1):
        if distance[i] == K:
            print(i)
else:
    print(-1)

 

반응형

'알고리즘 문제풀이' 카테고리의 다른 글

백준 -영재의 시험 19949 (Python)  (0) 2023.03.02
백준 - 소수 찾기 1978 (Python)  (0) 2023.03.02
백준 - 수들의 합 1789 (Python)  (0) 2023.03.01
백준 - 3의 배수 1769 (Python)  (0) 2023.03.01
백준 - 아기상어2 17086(Python)  (0) 2023.03.01
  1. 문제설명
  2. 입력
  3. 출력
  4. 예제입력 / 예제출력
  5. 문제이해 및 코드설명
  6. 코드
'알고리즘 문제풀이' 카테고리의 다른 글
  • 백준 -영재의 시험 19949 (Python)
  • 백준 - 소수 찾기 1978 (Python)
  • 백준 - 수들의 합 1789 (Python)
  • 백준 - 3의 배수 1769 (Python)
coryne
coryne
반응형
coryne
coryne의 정리노트
coryne
전체
오늘
어제
  • 분류 전체보기 (56)
    • python (2)
    • Web programing (1)
    • Linux (3)
    • Deep Learning (0)
    • 기타 (0)
    • 알고리즘 문제풀이 (49)
    • 빅데이터분석기사 (0)
    • 알고리즘 이론 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자료구조
  • 출처 : eduatoz
  • 빅데이터분석기사 실기
  • machine_learning
  • Python
  • 빅데이터분석기사
  • 그래프 탐색
  • 그래프 이론
  • 정수론
  • 너비 우선 탐색
  • 문자열
  • EduAtoZ
  • 큐
  • 플로이드-워셜
  • 그리디 알고리즘
  • 스택
  • 수학
  • 소수 판정
  • 자료 구조
  • 다이나믹 프로그래밍
  • 구현
  • 데이크스트라
  • 정렬
  • 백준
  • 깊이 우선 탐색
  • 공공데이터일경험수련생
  • 우선순위 큐
  • pandas
  • 브루트포스 알고리즘
  • 자료 구조(data_structures)

최근 댓글

최근 글

hELLO · Designed By 정상우.
coryne
백준 - 특정 거리의 도시 찾기 18352(Python)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.