#문제링크
https://www.acmicpc.net/problem/1446
1446번: 지름길
첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이
www.acmicpc.net
#나의풀이
import sys
if __name__=="__main__":
N, D = map(int, sys.stdin.readline().split())
arr = [[] for _ in range(10001)]
for _ in range(N):
start, end, express = map(int, sys.stdin.readline().split())
arr[start].append([end, express])
distance = [i for i in range(D+1)]
for i in range(D+1):
if i != 0:
distance[i] = min(distance[i], distance[i-1]+1)
for end, express in arr[i]:
if end <= D and distance[end] > express + distance[i]:
distance[end] = express + distance[i]
print(distance[D])
#해설
다익스트라 문제로 구분되서 풀었는데 단순 dp로도 풀리는거 같다.
arr = [[] for _ in range(10001)]
for _ in range(N):
start, end, express = map(int, sys.stdin.readline().split())
arr[start].append([end, express])
distance = [i for i in range(D+1)]
arr에 index가 시작위치가 되고 배열에 끝나는 지점과 지름길 길이가 저장된다.
distance는 dp가 될것이고 D의 길이만큼 생성해주었다.
for i in range(D+1):
if i != 0:
distance[i] = min(distance[i], distance[i-1]+1)
for end, express in arr[i]:
if end <= D and distance[end] > express + distance[i]:
distance[end] = express + distance[i]
print(distance[D])
i가 0일경우 인덱스 범위를 나가버리므로 0이 아닐때 이전과 비교하여 작은것을 선택한다.
이후 arr[i]에 고속도로가 있다면 끝나는 지점이 D를 넘기지 않는지 확인하고 distance[end]가 지름길+현재거리 보다 작다면 값을 바꿔준다.
'코딩테스트' 카테고리의 다른 글
[백준/파이썬] 5430 AC (0) | 2023.01.17 |
---|---|
[백준/파이썬] 27211 도넛 행성 쇼미더코드 3회차 (0) | 2023.01.15 |
[백준/파이썬] 1068 트리 (0) | 2023.01.10 |
[백준/파이썬] 1991 트리 순회 (0) | 2023.01.10 |
[백준/파이썬] 15724 주지수 (0) | 2023.01.10 |