본문 바로가기
백준알고리즘/동적 계획법1

(Python/🥈1)백준리즘알고리즘 1446번: 지름길

by windy7271 2023. 12. 15.
728x90
반응형

문제 바로가기 

지름길

 

문제:

매일 아침, 세준이는 학교에 가기 위해서 차를 타고 D킬로미터 길이의 고속도로를 지난다. 이 고속도로는 심각하게 커브가 많아서 정말 운전하기도 힘들다. 어느 날, 세준이는 이 고속도로에 지름길이 존재한다는 것을 알게 되었다. 모든 지름길은 일방통행이고, 고속도로를 역주행할 수는 없다. 세준이가 운전해야 하는 거리의 최솟값을 출력하시오.

입력:

첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이가 주어진다. 모든 위치와 길이는 10,000보다 작거나 같은 음이 아닌 정수이다. 지름길의 시작 위치는 도착 위치보다 작다.

출력:

세준이가 운전해야하는 거리의 최솟값을 출력하시오.

첫 시도1.

import sys

n, dis = map(int, sys.stdin.readline().split(" "))
dp = [i for i in range(dis+1)]

lst = sorted([list(map(int, sys.stdin.readline().split(" "))) for _ in range(n)], key = lambda x:x[0])

for i in lst:
    start, end, e = i
    dp[end] = min(dp[end], dp[start] + e)
for i in range(1, 10001):
    dp[i] = min(dp[i], dp[i-1] + 1)

 

지름길을 먼저 설정 해주고나서 dp를 돌렸더니 마지막 테스트 케이스가 실패하였다.

 

하나하나씩 검사해보기로 했다.

 

import sys

sys.stdin = open('/Users/song/Desktop/Python/Python/h.txt', 'r')

n, dis = map(int, sys.stdin.readline().split(" "))
dp = [i for i in range(dis+1)]

lst = sorted([list(map(int, sys.stdin.readline().split(" "))) for _ in range(n)], key = lambda x:x[0])

for i in range(dis + 1):
    if i > 0:
        dp[i] = min(dp[i], dp[i - 1] + 1)
    for start, end, d in lst:
        if i == start and end <= dis and dp[i] + d < dp[end]:
            dp[end] = dp[i] + d
print(dp[dis])

 

range 를 1 부터 하면 되지않냐? 라고 물어본다면, 0에서 50 으로 가는 지름길이 있기 때문에 사용불가.

 

i = 지름길에 도착하고 도착지점이 총 길이보다 짧으면 비교해서 dp[end] 에 넣어준다.

 

반응형

댓글