문제 링크입니다; https://programmers.co.kr/learn/courses/30/lessons/42897
코딩테스트 연습 - 도둑질
도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다. 각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한
programmers.co.kr
전형적인 DP 문제였습니다.
알고리즘은 아래와 같습니다.
1. 인접한 집을 털 수 없으므로 점화식은 다음과 같습니다. max(i번째 집 + (i - 2) 번째 집, (i - 1) 번째 집)
2. 1번에서 구한 점화식을 첫 번째 집 혹은 두 번째 집부터 적용이 가능합니다.
2.1 따라서, 첫 번째 집부터 적용한 점화식과 두 번째 집부터 적용한 점화식 중 더 큰 결과를 반환해줍니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <string> | |
#include <vector> | |
#include <algorithm> | |
using namespace std; | |
int solution(vector<int> money) { | |
vector<long long> startFromZero(money.size(), money[0]); | |
vector<long long> startFromOne(money.size(), money[1]); | |
for (int i = 2; i <= money.size() - 2; i++) | |
{ | |
startFromZero[i] = max(startFromZero[i - 1], startFromZero[i - 2] + money[i]); | |
} | |
startFromOne[0] = 0; | |
for (int i = 2; i <= money.size() - 1; i++) | |
{ | |
startFromOne[i] = max(startFromOne[i - 1], startFromOne[i - 2] + money[i]); | |
} | |
return max(startFromZero[money.size() - 2], startFromOne[money.size() - 1]); | |
} | |
int main(void) | |
{ | |
vector<int> money = { 1, 2, 3, 1 }; | |
cout << solution(money) << "\n"; | |
return 0; | |
} |

개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > programmers' 카테고리의 다른 글
[Programmers 코딩테스트 고득점 Kit] 디스크 컨트롤러 (0) | 2021.09.23 |
---|---|
[Programmers 코딩테스트 고득점 Kit] 더 맵게 (0) | 2021.09.22 |
[Programmers 코딩테스트 고득점 Kit] 등굣길 (0) | 2021.09.22 |
[Programmers 코딩테스트 고득점 Kit] 정수 삼각형 (0) | 2021.09.22 |
[Programmers 코딩테스트 고득점 Kit] N으로 표현 (0) | 2021.09.21 |