백준 사이트의 10217 번 문제 KCM Travel 문제를 풀어보았습니다.
매주 월요일마다 진행하는 알고리즘 스터디에서 Python 언어를 활용해 풀이한 내용들을 공유합니다.
저는 알고리즘 문제를 풀어본 지 6개월이 넘은 것 같습니다. 그래서 그런지,, 머리가 백지상태가 되었어요. ㅠㅠ
먼저 저는 https://www.youtube.com/watch?v=B4Ivp_ebm4c 이 영상을 참고하여 문제를 풀었습니다.
목적 : 인천에서 LA까지 M원 이하로 사용하면서 도착할 수 있는 가장 빠른 길
조건 :
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가지인 문제라고 판단했고, 접근방법에서 부터 막혔습니다.
위 참고영상에서의 문제 풀이를 보고 다시 문제의 조건을 보니 냅색문제와 유사하다는 것을 알았습니다.
가방의 공간 : 물건의 무게 = 지원 비용 : 소요 시간 , 다소 차이가 있지만 이런 식으로 생각했습니다.
위와 같이 예를 들었을 때, ( 공항의 개수는 4개 입니다, 5,6 행은 무시해주세요 )
소요 비용을 순서대로 탐색하며 각각의 공항에서 이동가능한 경우를 찾아 최소 소요 시간을 적용합니다.
위의 예시는 도착 지점(N) 에서 지원 비용을 만족하지 못해 "Poor KCM" 이 결과로 출력됩니다.
이와 같은 문제들을 타개하기 좋은 방법은
고려할 조건을 분명히 하고, 1차원 또는 2차원의 테이블로 그려보는 것도 좋은 방법같습니다.
이하 다른 스터디원분들의 풀이 방법입니다.
import sys
import heapq
input = sys.stdin.readline
for _ in range(int(input())):
n, m, k = map(int,input().split())
graph = {i:[] for i in range(1, n+1)}
for i in range(k):
a, b, c, d = map(int,input().split())
graph[a].append([b, c, d])
visited = [[int(1e9)]*(n+1) for _ in range(m+1)]
q = [[0,0,1]]
while q:
cost, time, now = heapq.heappop(q)
if cost > visited[time][now]: continue
for v, c, d in graph[now]: continue
if time + c <= m and cost + d < visited[time+c][v]:
for i in range(time+c,m+1):
if visited[i][v] > cost + d: visited[i][v] = cost + d
else: break
heapq.heappush(q,(cost+d,time+c,v))
print(visited[m][n] if visited[m][n] != int(1e9) else "Poor KCM")
import sys
INF = sys.maxsize
input = sys.stdin.readline
T = int(input())
for _ in range(T):
N, M, K = map(int,input().split())
graph = [[] for _ in range(N+1)]
for _ in range(K):
departure, arrival, expense, time = map(int,input().split())
graph[departure].append((arrival, expense, time))
arrival_expense = [[INF]*(M+1) for _ in range(N+1)]
arrival_expense[1][0] = 0
for e in range(M+1):
for d in range(1,N+1):
if arrival_expense[d][e] == INF:
continue
temp_time = arrival_expense[d][e]
for da, de, dt in graph[d]:
next_expense = de + e
if next_expense > M:
continue
arrival_expense[da][next_expense] = min(arrival_expense[da][next_expense],temp_time + dt)
result = min(arrival_expense[N])
print([result, 'Poor KCM'][result==INF])