티스토리 뷰

문제 설명

서울에서 경산까지 여행을 하면서 모금 활동을 하려 합니다. 여행은 서울에서 출발해 다른 도시를 정해진 순서대로 딱 한 번 방문한 후 경산으로 도착할 예정입니다. 도시를 이동할 때에는 도보 혹은 자전거를 이용합니다. 이때 도보 이동에 걸리는 시간, 도보 이동 시 얻을 모금액, 자전거 이동에 걸리는 시간, 자전거 이동 시 얻을 모금액이 정해져 있습니다. K시간 이내로 여행할 때 모을 수 있는 최대 모금액을 알아보려 합니다.

예를 들어 여행 루트가 다음과 같고 K = 1,650 일 때

1, 2번 구간은 도보로, 3번 구간은 자전거로 이동해 모금액을 660으로 하는 것이 가장 좋은 방법입니다. 이때, 1,600시간이 소요됩니다.

solution 함수의 매개변수로 각 도시를 이동할 때 이동 수단별로 걸리는 시간과 모금액을 담은 2차원 배열 travel과 제한시간 K가 주어집니다. 제한시간 안에 서울에서 경산까지 여행을 하며 모을 수 있는 최대 모금액을 return 하도록 solution 함수를 작성하세요.

제한사항

  • travel 배열의 각 행은 순서대로 [도보 이동에 걸리는 시간, 도보 이동 시 얻을 모금액, 자전거 이동에 걸리는 시간, 자전거 이동 시 얻을 모금액]입니다.
  • travel 배열 행의 개수는 3 이상 100 이하인 정수입니다.
  • travel 배열에서 시간을 나타내는 숫자(각 행의 첫 번째, 세 번째 숫자)는 10,000 이하의 자연수, 모금액을 나타내는 숫자(각 행의 두 번째, 네 번째 숫자)는 1,000,000 이하의 자연수입니다.
  • K는 0보다 크고 100,000보다 작거나 같은 자연수입니다.

입출력 예

Ktravelreturn

1650 [[500, 200, 200, 100], [800, 370, 300, 120], [700, 250, 300, 90]] 660
3000 [[1000, 2000, 300, 700], [1100, 1900, 400, 900], [900, 1800, 400, 700], [1200, 2300, 500, 1200]] 5900

입출력 예 설명

입출력 예#1
앞서 설명한 예와 같습니다.

입출력 예#2
1, 4번 구간은 도보로 이동하고 2, 3번 구간은 자전거로 이동하여 모금액을 5,900원으로 하는 것이 가장 좋은 방법입니다. 이때 걸리는 시간은 3,000시간입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int solution(int K, vector<vector<int>> travel) {
    int answer = 0;
    vector<vector<int>> cache(travel.size()+1vector<int> (K+10));
    
    cache[0][travel[0][0]] = travel[0][1];
    cache[0][travel[0][2]] = travel[0][3];
    
    for (int i = 1; i < travel.size(); i++) {
        for (int j = 0; j <= K; j++) {
            if (cache[i-1][j] == 0) {
                continue;
            }
            
            int walking_time = travel[i][0];
            int walking_price = travel[i][1];
            int biking_time = travel[i][2];
            int biking_price = travel[i][3];
            
            if (j + walking_time <= K){
                cache[i][j+walking_time] = max(cache[i][j+walking_time], cache[i-1][j] + walking_price);
                
                if (i == travel.size() - 1) {
                    answer = max(answer, cache[i][j+walking_time]);
                }
            }
            
            if (j + biking_time <= K) {
                cache[i][j+biking_time] = max(cache[i][j+biking_time], cache[i-1][j] + biking_price);
                
                if (i == travel.size() - 1) {
                    answer = max(answer, cache[i][j+biking_time]);
                }
            }
        }
    }
    
    return answer;
}
 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함