https://www.acmicpc.net/problem/1446
1446번: 지름길
첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하이고, D는 10,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이가 주
www.acmicpc.net
풀이 과정
- 지름길 데이터를 정리한다.
- 시작점과 도착점이 같은데 이동 거리가 다른 지름길이 있을 수 있으므로 최소 거리로 해주어야 한다.
- 최소 거리로 조정한 다음, 딕셔너리를 사용하여 [시작점] = [[도착점, 이동거리], ... ] 형식으로 데이터를 저장한다.
- BFS를 진행한다.
- 시작점과 이동거리를 a, b라고 할 때, 두가지 경우가 존재한다.
- 현재 지점의 다음 지점을 큐에 삽입한다. (a+1, b+1)
- 만약 현재 지점에 대응하는 키가 딕셔너리에 존재한다면(지름길이 존재한다면) 지름길로도 이동해보면 된다. (도착점, b+지름길 이동 거리)
- 현재 지점이 D라면, 정답을 갱신시켜 준다. 이 때 유의할 점은, 일방통행이므로 D를 넘게 되면 정답 처리가 되지 않음에 유의한다.
- 정답을 출력한다.
문제의 분류는 다익스트라 알고리즘이었으나.. 처음 떠오른 방식이 BFS라 BFS로 풀이함. BFS가 아니더라도 다익스트라 알고리즘이나 DP로도 풀수 있다고 생각한다.
소스 코드
import sys
from collections import defaultdict, deque
input = lambda : sys.stdin.readline().rstrip()
N, D = map(int, input().split())
temp = defaultdict(lambda:int(10e9))
for _ in range(N):
s, e, d = map(int, input().split())
temp[(s, e)] = min(temp[(s, e)], d)
shortcut = defaultdict(lambda:[])
for (s, e), d in temp.items():
shortcut[s].append([e, d])
queue = deque()
queue.append([0, 0])
answer = int(10e9)
while queue:
current, movement = queue.popleft()
if current > D:
continue
if current == D:
answer = min(answer, movement)
continue
if shortcut.get(current) != None:
for e, d in shortcut[current]:
queue.append([e, movement + d])
queue.append([current+1, movement+1])
print(answer)
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 3079 ] [ 이분 탐색 ] 입국심사 (0) | 2021.10.17 |
---|---|
[ 22865 ] [ Dijkstra ] 가장 먼 곳 (0) | 2021.10.16 |
[ 14938 ] [ Dijkstra ] 서강그라운드 (0) | 2021.10.14 |
[ 1743 ] [ BFS ] 음식물 피하기 (0) | 2021.10.13 |
[ 6550 ] [ Queue ] 부분 문자열 (0) | 2021.10.12 |