BOJ Code/Platinum

[백준/BOJ] platinum5 - 10217번 KCM Travel (Python)

NIMHO 2022. 6. 13. 09:47
728x90

▶10217 - KCM Travel

문제

각고의 노력 끝에 찬민이는 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"을 출력한다.

 

풀이

다익스트라를 이용해서 푸는 문제이다.

열에는 비용, 행에는 도착지점으로 쓰기 위한 dp를 하나 만들어서 이용했다.

비용을 차례대로 도착지점과 확인하면서 그 자리에 시간을 넣어주면서 풀었다.

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%81%AC%EC%8A%A4%ED%8A%B8%EB%9D%BC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

 

데이크스트라 알고리즘 - 위키백과, 우리 모두의 백과사전

컴퓨터 과학에서, 데이크스트라 알고리즘(영어: Dijkstra algorithm) 또는 다익스트라 알고리즘은 도로 교통망 같은 곳에서 나타날 수 있는 그래프에서 꼭짓점 간의 최단 경로를 찾는 알고리즘이다.

ko.wikipedia.org

내가 풀었는데 어떻게 풀었는지 모르는 이유는...

거의 1년 전에 풀었던 문제이기 때문이다...

문제를 다시 풀고, 분석해보고 글을 써야겠다.

import sys

T = int(input())
INF = sys.maxsize
arr = []
for _ in range(T):
    N, M, K = map(int, sys.stdin.readline().split())
    ticket = [[] for _ in range(N + 1)]
    for _ in range(K):
        u, v, c, d = map(int, sys.stdin.readline().split())
        ticket[u].append([v, c, d])

    DP = [[INF for _ in range(M + 1)] for _ in range(N + 1)]
    DP[1][0] = 0

    for c in range(M + 1):
        for d in range(1, N + 1):
            if DP[d][c] == INF:
                continue
            t = DP[d][c]
            for dv, dc, dd in ticket[d]:
                if dc + c > M:
                    continue
                DP[dv][dc + c] = min(DP[dv][dc + c], t + dd)

    result = min(DP[N])
    arr.append(result)

for i in arr:
    if i == INF:
        print('Poor KCM')
    else:
        print(i)

 

728x90