알고리즘/프로그래머스

Programers 도둑질

내이름은 킹햄찌 2022. 3. 12. 22:11

https://programmers.co.kr/learn/courses/30/lessons/42897

 

코딩테스트 연습 - 도둑질

도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다. 각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한

programmers.co.kr

프로그래머스 도둑질 문제입니다.

 

#include <string>
#include <vector>

using namespace std;
int max(int a,int b){
    return a>b?a:b;
}
int solution(vector<int> money) {
    vector<int> dp1(money.size(),0);
    vector<int> dp2(money.size(),0);
    dp1[0] = money[0];
    dp1[1] = money[0];
    dp2[1] = money[1];
    
    //첫번째 -> 마지막전
    for(int i = 2; i<dp1.size()-1;i++){
        dp1[i] = max(dp1[i-1], dp1[i-2] + money[i]);
    }
    //두번째 -> 마지막
    for(int i = 2; i<dp1.size();i++){
        dp2[i] = max(dp2[i-1], dp2[i-2] + money[i]);
    }
    
    int answer = max(dp1[dp1.size()-2], dp2[dp2.size()-1]);
    return answer;
}

아이디어

이 문제를 처음 풀이 했을때는 동그랗게 배치되어 있다는 것을 간과하고 단순하게 점화식을 세워서 호되게 혼났다

동그란 배치때문에 첫번째 집과 마지막 집이 인접한 집으로 처리를 할 방법을 고민해야 했음

한번의 점화식으로 해결하는 방법을 찾지 못하고 첫번째를 털때는 마지막집을 방문하지않고, 두번째집을 털때는 마지막집까지 방문하는 두개의 경우의 수로 나누어서 처리 했음