문제
각고의 노력 끝에 찬민이는 2014 Google Code Jam World Finals에 진출하게 되었다. 구글에서 온 초대장을 받고 기뻐했던 것도 잠시, 찬찬히 읽어보던 찬민이는 중요한 사실을 알아차렸다. 최근의 대세에 힘입어 구글 역시 대기업답게 비용 감축에 열을 내고 있었던 것이다.
초대장 내용에 의하면 구글은 찬민에게 최대 M원까지의 비용만을 여행비로써 부담해주겠다고 한다. 인천에서 LA행 직항 한 번 끊어주는게 그렇게 힘드냐고 따지고도 싶었지만, 다가올 결승 대회를 생각하면 대회 외적인 곳에 마음을 쓰고 싶지 않은 것 또한 사실이었다. 그래서 찬민은 인천에서 LA까지 M원 이하로 사용하면서 도착할 수 있는 가장 빠른 길을 차선책으로 택하기로 하였다.
각 공항들간 티켓가격과 이동시간이 주어질 때, 찬민이 인천에서 LA로 갈 수 있는 가장 빠른 길을 찾아 찬민의 대회 참가를 도와주자.
입력
입력 파일의 첫 번째 줄에 테스트 케이스의 수를 의미하는 자연수 T가 주어진다. 그 다음에는 T개의 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 줄에는 공항의 수 N (2 ≤ N ≤ 100), 총 지원비용 M (0 ≤ M ≤ 10,000), 티켓정보의 수 K (0 ≤ K ≤ 10,000)가 공백으로 구분되어 주어진다. 이어서 K개의 줄에 걸쳐 각 티켓의 출발공항 u, 도착공항 v (1 ≤ u, v ≤ N, u ≠ v), 비용 c (1 ≤ c ≤ M, 정수), 그리고 소요시간 d (1 ≤ d ≤ 1,000) 가 공백으로 구분되어 주어진다. 인천은 언제나 1번 도시이고, LA는 언제나 N번 도시이다
출력
각 테스트 케이스당 한 줄에 찬민이 LA에 도착하는 데 걸리는 가장 짧은 소요시간을 출력한다.
만약, LA에 도착할 수 없는 경우 "Poor KCM"을 출력한다.
예제 입력 1
2
3 100 3
1 2 1 1
2 3 1 1
1 3 3 30
4 10 4
1 2 5 3
2 3 5 4
3 4 1 5
1 3 10 6
예제 출력 1
2
Poor KCM
나의 풀이
해당 문제는 DP를 사용하여 풀 수 있는 문제였다.
우선 공항과 비용에 대하여 최소 거리를 저장하는 DP 2차원 배열을 만들어야한다.
dp[공항][비용]
와 같이 만들고 각 공항에 대하여 0부터 총 지원비용인 M만큼 반복을 하면서 최솟값을 업데이트 해나가야한다.처음에 해당 문제를 다익스트라로 접근을 하여 풀었지만 시간초과가 나는 문제가 있었다. 분명 검색을 해서 c++이나 java의 정답코드와 로직이 같은데 pypy3는 계속 시간초과라는 결과만 나왔다. 이유는 아직 잘 모르겠지만... 다익스트라를 사용하지 않고 DP만으로 풀어내니 정답을 받아낼 수 있었다..
코드
import sys
INF = sys.maxsize
for _ in range(int(sys.stdin.readline())):
n, m, k = map(int, sys.stdin.readline().split())
adj_list = [[] for _ in range(n+1)] # 인접 리스트
for _ in range(k):
u, v, c, d = map(int, sys.stdin.readline().split())
adj_list[u].append([v, c, d])
dp = [[INF] * (m+1) for _ in range(n+1)]
dp[1][0] = 0 # 처음 1번에서의 비용은 0
for money in range(m+1):
for here in range(1, n+1):
if dp[here][money] == INF: # 경로가 없는 경우
continue
h_dis = dp[here][money] # money에서의 현재 공항까지 최소거리
for there, t_m, t_d in adj_list[here]: # 현재 공항에서 갈 수 있는 공항 모두 확인
if money + t_m > m: # 총 지원비용 초과하는 경우
continue
# 거리의 최솟값으로 업데이트
dp[there][money + t_m] = min(dp[there][money + t_m], h_dis + t_d)
answer = min(dp[n])
print("Poor KCM" if answer == INF else answer)
'Programming > Algorithm' 카테고리의 다른 글
[백준11659번] 구간 합 구하기 4 / Python3 (0) | 2020.12.12 |
---|---|
[백준1956번] 운동 / Python3 (0) | 2020.12.10 |
[백준11404번] 플로이드 / Python3 (0) | 2020.12.08 |
[백준11657번] 타임머신 / Python3 (0) | 2020.12.08 |
[백준4195번] 친구 네트워크 / Python3 (0) | 2020.12.06 |