[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 |
[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 |