코딩테스트/프로그래머스
[프로그래머스] 도둑질
쪼르뚜
2024. 10. 25. 01:39
728x90
반응형
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42897#
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
반응형
728x90
👩💻 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(vector<int> money) {
int n = money.size();
vector<int> dpFirst(n, 0);
dpFirst[0] = money[0];
dpFirst[1] = max(money[0], money[1]);
for (int i = 2; i < n - 1; ++i) {
dpFirst[i] = max(dpFirst[i-1], dpFirst[i-2] + money[i]);
}
vector<int> dpLast(n, 0);
dpLast[1] = money[1];
dpLast[2] = max(money[1], money[2]);
for (int i = 3; i < n; ++i) {
dpLast[i] = max(dpLast[i-1], dpLast[i-2] + money[i]);
}
return max(dpFirst[n-2], dpLast[n-1]);
}
📝 풀이
원형 배열이고 인접한 두 집은 털 수 없으니 첫 번째 집을 털었을 경우와 털지 않았을 경우로 나누어야 합니다.
첫 번째 집을 턴 경우는 마지막 집을 털 수 없으므로 money[0]부터 money[n-2]까지의 범위입니다.
첫 번재 집을 털지 않은 경우는 마지막 집을 털 수 있으므로 money[1]부터 money[n-1]까지의 범위입니다.
각 배열의 dp[i]는 i번째 집까지 훔칠 수 있는 최대 금액입니다.
i번째 집을 털지 않은 경우 👉 dp[i-1]
i번째 집을 털 경우 👉 dp[i-2] + money[i]
둘 중 큰 값을 선택하여 dp[i]를 갱신합니다.
최종적으로 두 경우 중 큰 값을 return 합니다.
728x90
반응형