2025. 3. 18. 23:11ㆍ[Algorithm]/문제 풀이
문제
https://www.acmicpc.net/problem/1446
사용 알고리즘
DP
풀이
고려사항
1. 지름길 관리 방법
2. 바로 전에 길에서 온 값과 현재 길에 적혀있는 값 비교
3. 현재 지점에서 갈 수 있는 지름길 탐색
후기
1. 이 문제의 keypoint는 지름길 사용 유무에 따른 값 갱신이다.
2. 현재 위치에서 가지고 있는 값과 이전 값에서 오는 값을 비교하여 갱신을 진행한다.
일반 도로 이동 → dp[cur] = dp[cur-1] + 1
- 지름길을 사용하지 않고 이전 길에서 오는 것 : 이전 값에서 1km 더 온 것으로 "이전 값 + 1"
현재 위치에서 최소값 → dp[cur]
- 지름길로 온 값 : 이미 출발점에서 온 값으로 갱신 되어 있는 값
3. 이후 현재 위치에서 갈 수 있는 지름길을 탐색하여 그 위치의 값과 비교하여 갱신을 진행한다.
지름길 적용 → 출발점이 cur인 지름길을 이용하여 dp[도착점]을 갱신
4. 이때, 지름길은 list와 lambda를 사용하여 관리하였다.
- 딕셔너리는 중복 값이 있어 초기 세팅에 불리하였다.
- 정렬이 없는 리스트는 순서가 보장되지 않기 때문에
매 위치마다 지름길을 모두 탐색해야한다.
특히, 이 문제의 경우 현재 위치에서 갈 수 있는 지름길이
한 개로 정해지지 않았기 때문에 중간에 끊을 수도 없다.
때문에 시간관리 측면에서 불리하였다.
- heapq 방식도 고려했으나,
이 문제의 경우 매번 지름길이 생기거나 값이 변하지 않기 때문에 불필요한 정렬을 줄이고
매번 heappop과 사용하지 않았을 경우 발생되는 heappush가
꼭 필요하지 않다고 생각되어 사용하지 않았다.
- 출발점 기준으로 지름길을 탐색할 것이고 역주행을 하지않아 이미 사용한 것을 보지 않아도 되기 때문에
list와 lambda 방식으로 출발점을 기준으로 정렬한 방식으로 지름길을 관리하였다.
예상 시간복잡도 : O(NlogN)
- 이때, 현재 위치에서 지름길이 여러개 일 수 있어 while을 통해 다음 위치를 만날때까지 진행해주었다.
- 또한, 마지막의 경우까지 지름길을 탐색했다면 이후에 index error가 발생할 수 있다.
이 에러를 방지하기 위해 절대 만나지 않을 값(도착점보다 10 큰 값)을
지름길 리스트에 더해주어 관리하였다.
5. index 관련 문제는 시작할 때도 발생 할 수 있었다.
일반도로를 이용한 경우 이전값과 비교해야하기 때문에 이전값이 존재해야한다.
때문에 [0]보다 전의 [0]을 하나 더 넣어주고 관리하였다.
이런 경우 기본 세팅해주고 시작하는거보다 일반화 할 수 있어 편했지만
뒤에 인덱스 관리 할 때 헷갈리지 않게 주의가 필요했다.
코드
import sys
input = sys.stdin.readline
N, D = map(int, input().split())
shortcuts = [list(map(int, input().split())) for _ in range(N)] + [[D + 10, 0, 0]]
shortcuts.sort(key=lambda x: x)
dp = [0] + [i for i in range(D + 1)]
s_idx = 0
for cur in range(1, D + 2):
# 이전 값과 비교하여 현재 값 갱신
dp[cur] = min(dp[cur - 1] + 1, dp[cur])
# 지름길을 활용한 값 갱신
while shortcuts[s_idx][0] == cur - 1:
if shortcuts[s_idx][1] <= D:
dp[shortcuts[s_idx][1] + 1] = min(
dp[shortcuts[s_idx][1] + 1], dp[cur] + shortcuts[s_idx][2]
)
s_idx += 1
print(dp[D + 1])
결과
'[Algorithm] > 문제 풀이' 카테고리의 다른 글
[BOJ_Python] 9663.N-Queen (0) | 2025.06.06 |
---|---|
[BOJ_Python] 2116. 주사위 쌓기 (0) | 2025.05.28 |
[BOJ_Python] 1535. 안녕 (0) | 2024.12.16 |
[BOJ_Python] 12865. 평범한 배낭 (1) | 2024.12.15 |
[BOJ_Python] 16493. 최대 페이지 수 (0) | 2024.12.14 |