1446번: 지름길
첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이
www.acmicpc.net
문제
매일 아침, 세준이는 학교에 가기 위해서 차를 타고 D킬로미터 길이의 고속도로를 지난다. 이 고속도로는 심각하게 커브가 많아서 정말 운전하기도 힘들다. 어느 날, 세준이는 이 고속도로에 지름길이 존재한다는 것을 알게 되었다. 모든 지름길은 일방통행이고, 고속도로를 역주행할 수는 없다.
세준이가 운전해야 하는 거리의 최솟값을 출력하시오.
입력
첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이가 주어진다. 모든 위치와 길이는 10,000보다 작거나 같은 음이 아닌 정수이다. 지름길의 시작 위치는 도착 위치보다 작다.
출력
세준이가 운전해야하는 거리의 최솟값을 출력하시오.
코드
n, d = map(int, input().split())
roads = []
for _ in range(n):
s, e, l = map(int, input().split())
roads.append((s, l, e))
roads.sort()
dp = [i for i in range(10001)] # i번 위치까지 운전해야 하는 최소 거리
for i in range(n):
s, l, e = roads[i]
if dp[e] > dp[s] + l:
dp[e] = dp[s] + l
for j in range(1, d-e+1):
dp[e+j] = min(dp[e] + j, dp[e+j])
print(dp[d])
dp[i]에는 i 위치까지 가기 위해 운전해야 하는 최소 거리를 저장할 것이다.
입력받은 지름길을 출발지점, 지름길 길이, 도착지점 순서로 오름차순 정렬한 뒤, 출발지에서 가까운 지름길부터 하나씩 살펴보며 만약 이 지름길을 이용하는 것이 이득인 경우, 즉 도착지점 e의 dp[e]의 원래 값이 출발지점(s)에서 지름길(l)을 사용한 값보다 크다면 dp[e]의 값을 더 작은 값인 dp[s]+l로 갱신해준다. 그리고 도착지점(e) 이후의 dp 값들을 이번 지름길을 이용한 뒤의 값(dp[e]+j)이 원래 값(dp[e+j])보다 작다면 dp[e]+j로 바꿔준다.
'문제풀이 > 최단경로' 카테고리의 다른 글
[Python/파이썬] 백준 4485번 녹색 옷 입은 애가 젤다지? (0) | 2024.01.04 |
---|---|
[Python/파이썬] 백준 14284번 간선 이어가기 2 (0) | 2023.12.29 |
[Python/파이썬] 백준 15723번 n단 논법 (0) | 2023.12.14 |
[Python/파이썬] 백준 21940번 가운데에서 만나기 (1) | 2023.10.23 |
[Python/파이썬] 백준 16118번 달빛 여우 (1) | 2023.08.23 |
1446번: 지름길
첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이
www.acmicpc.net
문제
매일 아침, 세준이는 학교에 가기 위해서 차를 타고 D킬로미터 길이의 고속도로를 지난다. 이 고속도로는 심각하게 커브가 많아서 정말 운전하기도 힘들다. 어느 날, 세준이는 이 고속도로에 지름길이 존재한다는 것을 알게 되었다. 모든 지름길은 일방통행이고, 고속도로를 역주행할 수는 없다.
세준이가 운전해야 하는 거리의 최솟값을 출력하시오.
입력
첫째 줄에 지름길의 개수 N과 고속도로의 길이 D가 주어진다. N은 12 이하인 양의 정수이고, D는 10,000보다 작거나 같은 자연수이다. 다음 N개의 줄에 지름길의 시작 위치, 도착 위치, 지름길의 길이가 주어진다. 모든 위치와 길이는 10,000보다 작거나 같은 음이 아닌 정수이다. 지름길의 시작 위치는 도착 위치보다 작다.
출력
세준이가 운전해야하는 거리의 최솟값을 출력하시오.
코드
n, d = map(int, input().split()) roads = [] for _ in range(n): s, e, l = map(int, input().split()) roads.append((s, l, e)) roads.sort() dp = [i for i in range(10001)] # i번 위치까지 운전해야 하는 최소 거리 for i in range(n): s, l, e = roads[i] if dp[e] > dp[s] + l: dp[e] = dp[s] + l for j in range(1, d-e+1): dp[e+j] = min(dp[e] + j, dp[e+j]) print(dp[d])
dp[i]에는 i 위치까지 가기 위해 운전해야 하는 최소 거리를 저장할 것이다.
입력받은 지름길을 출발지점, 지름길 길이, 도착지점 순서로 오름차순 정렬한 뒤, 출발지에서 가까운 지름길부터 하나씩 살펴보며 만약 이 지름길을 이용하는 것이 이득인 경우, 즉 도착지점 e의 dp[e]의 원래 값이 출발지점(s)에서 지름길(l)을 사용한 값보다 크다면 dp[e]의 값을 더 작은 값인 dp[s]+l로 갱신해준다. 그리고 도착지점(e) 이후의 dp 값들을 이번 지름길을 이용한 뒤의 값(dp[e]+j)이 원래 값(dp[e+j])보다 작다면 dp[e]+j로 바꿔준다.
'문제풀이 > 최단경로' 카테고리의 다른 글
[Python/파이썬] 백준 4485번 녹색 옷 입은 애가 젤다지? (0) | 2024.01.04 |
---|---|
[Python/파이썬] 백준 14284번 간선 이어가기 2 (0) | 2023.12.29 |
[Python/파이썬] 백준 15723번 n단 논법 (0) | 2023.12.14 |
[Python/파이썬] 백준 21940번 가운데에서 만나기 (1) | 2023.10.23 |
[Python/파이썬] 백준 16118번 달빛 여우 (1) | 2023.08.23 |