ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 서울에서 경산까지
    문제 풀이 2020. 5. 20. 18:20
    문제 설명

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

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

    ㅅㅡㅋㅡㄹㅣㄴㅅㅑㅅ 2018-08-16 ㅇㅗㅈㅓㄴ 11.08.33.png

    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


    풀이)

    dp로 푼 문제였다.

    처음에 dp + dfs로 해버렸더니 시간 초과가 나서

    아예 dp만 사용하도록 바꿨다.


    배열 

    int dp[i][j] // i번째 장소에서 시간이 j일때 모금액


    코드)

    #include <string>
    #include <vector>
    #include<iostream>
    using namespace std;
    
    int dp[101][100001];
    /*

    시간초과 남 int result = 0; void dfs(int idx,int val,vector<vector<int>> travel,int K){ if(idx >= travel.size()){ result = max(result, dp[idx-1][val]); return; } // cout << idx << endl; for(int i=0;i<3;i+=2){ int cur = val + travel[idx][i]; if(cur > K) continue; if(dp[idx][cur] < dp[idx-1][val] + travel[idx][i+1]){ //cout << dp[idx][val] << endl; dp[idx][cur] = dp[idx-1][val] + travel[idx][i+1]; //cout << i<< ": 시간: "<<cur <<" 가격:"<< dp[idx][cur] << endl; dfs(idx+1,cur,travel,K); } } } */ int solution(int K, vector<vector<int>> travel) { int answer = 0; dp[0][travel[0][0]] = travel[0][1]; dp[0][travel[0][2]] = travel[0][3]; for(int i = 1; i < travel.size(); ++i) { for(int k = 0; k <= K; k++) { if(dp[i-1][k] == 0) continue; if(k + travel[i][0] <= K) { dp[i][k+travel[i][0]] = max(dp[i][k+travel[i][0]], dp[i-1][k] + travel[i][1]); answer = max(answer, dp[i][k + travel[i][0]]); } if(k + travel[i][2] <= K) { dp[i][k+travel[i][2]] = max(dp[i][k+travel[i][2]], dp[i-1][k] + travel[i][3]); answer = max(answer, dp[i][k + travel[i][2]]); } } } return answer; }



    '문제 풀이' 카테고리의 다른 글

    [프로그래머스] 이중우선순위큐  (0) 2020.05.21
    [프로그래머스] 라면공장  (0) 2020.05.21
    [프로그래머스] 카드게임  (0) 2020.05.20
    [프로그래머스] 등굣길  (0) 2020.05.19
    [프로그래머스] 순위  (0) 2020.05.18

    댓글

Designed by Tistory.