티스토리 뷰

문제출처 - https://programmers.co.kr/learn/courses/30/lessons/42897

 

코딩테스트 연습 - 도둑질 | 프로그래머스

도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다. 각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한 두 집을 털면 경보가 울립니다. 각 집에 있는 돈이 담긴 배열 money가 주어질 때, 도둑이 훔칠 수 있는 돈의 최댓값을 return 하도록 solution 함수를 작성하세요. 제한사항 이 마을에 있는 집은 3개 이상 1,000,000개 이하입니다. money 배열의 각

programmers.co.kr

// DP
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> money) {
    vector<int> dp(money.size(), 0);
    vector<int> dp2(money.size(), 0);
    
    // 첫번째 집부터 훔친 경우 -> 맨 마지막 집은 못훔침
    dp[0] = money[0];
    dp[1] = money[0];
    for(int i=2; i<money.size() - 1; i++) {
        dp[i] = max(dp[i-2] + money[i], dp[i-1]);
    }

    // 두번째 집부터 훔친 경우 -> 맨 마지막 집 훔칠 수 있음
    dp2[0] = 0;
    dp2[1] = money[1];
    for(int i=2; i<money.size(); i++) {
        dp2[i] = max(dp2[i-2] + money[i], dp2[i-1]);
    }
    
    return max(dp[money.size()-2]), dp2.back());
}

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함