๋ฌธ์
1. ๋ฌธ์ ์ค๋ช
2. ์ ํ์ฌํญ
ํ์ด
์ฝ๋
1. <์ ํ์ top-down>
2. <์ ํ์ bottom-up>
3. ์ค๋ต์ฝ๋ <์ฌ๊ทํจ์>
๊ฒฐ๊ณผ
1. <์ ํ์ top-down>
2. <์ ํ์ bottom-up>
3. <์ฌ๊ท - ํจ์จ์ฑ 0์ >

๋ฌธ์
1. ๋ฌธ์ ์ค๋ช
๋๋์ด ์ด๋ ๋ง์์ ํธ ๊ณํ์ ํ๊ณ ์์ต๋๋ค. ์ด ๋ง์์ ๋ชจ๋ ์ง๋ค์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋๊ทธ๋๊ฒ ๋ฐฐ์น๋์ด ์์ต๋๋ค.
๊ฐ ์ง๋ค์ ์๋ก ์ธ์ ํ ์ง๋ค๊ณผ ๋ฐฉ๋ฒ์ฅ์น๊ฐ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ธ์ ํ ๋ ์ง์ ํธ๋ฉด ๊ฒฝ๋ณด๊ฐ ์ธ๋ฆฝ๋๋ค.
๊ฐ ์ง์ ์๋ ๋์ด ๋ด๊ธด ๋ฐฐ์ด money๊ฐ ์ฃผ์ด์ง ๋, ๋๋์ด ํ์น ์ ์๋ ๋์ ์ต๋๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์ธ์.
2. ์ ํ์ฌํญ
- ์ด ๋ง์์ ์๋ ์ง์ 3๊ฐ ์ด์ 1,000,000๊ฐ ์ดํ์ ๋๋ค.
- money ๋ฐฐ์ด์ ๊ฐ ์์๋ 0 ์ด์ 1,000 ์ดํ์ธ ์ ์์ ๋๋ค.
ํ์ด
- ๋ง์ฝ ์์ ํ์์ผ๋ก ํ๊ณ ์ ํ๋ค๋ฉด?
- ๋ฐ๋ณต์ index 0๋ถํฐ n-1๊น์ง ๋๋ฉด์ ํด๋น ์ง์์ ์์ํด์ ๋ํ๋๋ ์ต๋์ money๋ฅผ ๊ตฌํ ์ ์์
- ํ์ง๋ง index 2๋ฅผ ๊ณ ๋ฅธ๋ค๋ฉด, ์ง์ ๊ฐ์๊ฐ ์ง์์ผ ๋ index 0์ ๊ณ ๋ฅผ ์ ์๊ณ ํ์์ผ ๋ index 1์ ๊ณ ๋ฅผ ์ ์์
- ๊ณ ๋ก index 0๊ณผ 1๋ง ๊ณ ๋ คํ๋ฉด ๋จ
- DP
- 3๋ฒ์งธ <์ฌ๊ทํจ์> ์ฝ๋
- top-down ๋ฐฉ์์ผ๋ก ํด๋น index์์์ maxMoney ๊ตฌํด์ ์ ์ฅ
- ์ ํ์ ํ์ด ์ฝ๋
- DP๋ ๋ฐฐ์ด์ ์ด์ฉํ ์ ํ์ ํ์ด๋ฅผ ๋จผ์ ์๊ฐํด๋ณด๊ณ ์๋๋ฉด ์ฌ๊ทํจ์๋ก ๋๋ฆฌ์.
- 1์ฐจ์ ๋ฐฐ์ด(arr)์์ ์ง์ index๋ฅผ ๋ฐฐ์ด์ index, ๊ฐ์ ์ต๋ money๋ก ๋ณด์.
- 1๋ฒ์งธ top-down (๋ฐฐ์ด์ผ๋ก ๋ดค์ ๋, ๋ง์ง๋ง ์์๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์ด์ ์์๋ฅผ ์ด์ฉ) ์ฝ๋
- ํ์ฌ index๋ฅผ i๋ผ ํ ๋,
- arr[i] = max(arr[i-2]+ money[i], arr[i-1])
- 2๋ฒ์งธ bottom-up (๋ฐฐ์ด์ผ๋ก ๋ดค์ ๋, ์ฒซ๋ฒ์งธ ์์๋ฅผ ์ด์ฉํด์ ๋ง์ง๋ง ์์๋ค์ ์์ฑ) ์ฝ๋
- arr[i+2] = max(arr[i+2], arr[i] + money[i+2])
- arr[i+1] = max(arr[i+1], arr[i])
- 3๋ฒ์งธ <์ฌ๊ทํจ์> ์ฝ๋
์ฝ๋
1. <์ ํ์ top-down>
#include <string>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int memo[1000001];
int memo2[1000001];
int solution(vector<int> money) {
// top-down
int answer = 0;
memset(memo, -1, sizeof(memo));
memset(memo2, -1, sizeof(memo2));
int size = money.size();
memo[0] = money[0];
memo[1] = memo[0];
for(int i=2; i<size-1; i++){ // ์ฒซ๋ฒ์งธ ์์์์ ์์ํ๋ฉด ๋ง์ง๋ง ์์ ์ ์ธ
memo[i] = max(memo[i-2] + money[i], memo[i-1]);
}
memo2[0] = 0;
memo2[1] = money[1];
for(int i=2; i<size; i++){ // ๋๋ฒ์งธ ์์์์ ์์ํ๋ฉด ๋ง์ง๋ง ์์ ํฌํจ
memo2[i] = max(memo2[i-2] + money[i], memo2[i-1]);
}
answer = max(memo[size-2], memo2[size-1]);
return answer;
}
2. <์ ํ์ bottom-up>
#include <string>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int memo[1000001];
int memo2[1000001];
int solution(vector<int> money) {
// bottom-up
int answer = 0;
memset(memo, -1, sizeof(memo));
memset(memo2, -1, sizeof(memo2));
int size = money.size();
memo[0] = money[0];
memo[1] = memo[0];
for(int i=0; i<size-2; i++){
memo[i+2] = max(memo[i+2], memo[i] + money[i+2]);
memo[i+1] = max(memo[i+1], memo[i]);
// size-2๋ฅผ ๊ตฌํ๋๋ฐ ์ต๋ size-1๊น์ง ๋์ค๋ฏ๋ก ํ์์๋ ์ฐ์ฐ์ด ์ถ๊ฐ๋จ
}
memo2[0] = 0;
memo2[1] = money[1];
for(int i=0; i<size-1; i++){
memo2[i+2] = max(memo2[i+2], memo2[i] + money[i+2]);
memo2[i+1] = max(memo2[i+1], memo2[i]);
}
answer = max(memo[size-2], memo2[size-1]);
return answer;
}
3. ์ค๋ต์ฝ๋ <์ฌ๊ทํจ์>
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int N;
vector<int> moneyArr;
int memo[1000001];
bool isBitmapEmpty(vector<int>& vec) {
for (int i = 0; i < vec.size(); i++) {
if (vec[i] == 1)
return false;
}
return true;
}
int stillMoney(vector<int>& bitmap, int prev) {
if (isBitmapEmpty(bitmap)) // ๋์ด์ ํ์น ์ ์๋ ์ง์ด ์์ผ๋ฉด 0 return
return 0;
int maxMoney = 0; // ์ต๋ ํ์น ๋
for (int i = prev; i < N; i++) { // ํ๋ฐํด ๋๊ฒ ๋๋ฉด ์๋์ผ๋ก for๋ฌธ ์ข
๋ฃ
vector<int> houses(bitmap);
if (houses[i] == 0) // ํ์น ์ ์์ผ๋ฉด
continue;
if (memo[i] != -1) {
// memo๊ฐ ์์ผ๋ฉด
maxMoney = max(maxMoney, memo[i]);
continue;
}
houses[i] = 0; // ์ด๋ฏธ ํ์ณค์ผ๋ฏ๋ก ๋์ด์ ํ์น ์ ์์
houses[(i - 1 + N) % N] = 0; // ์ด์ ์ง์ ์ธ์ ํด์์ผ๋ฏ๋ก ํ์น ์ ์์
houses[(i + 1) % N] = 0; // ์ดํ ์ง
int tmpMoney = stillMoney(houses, i + 2) + moneyArr[i];
if (maxMoney < tmpMoney) {
maxMoney = tmpMoney;
}
}
memo[prev] = maxMoney;
return maxMoney;
}
int solution(vector<int> money) {
moneyArr = money;
N = moneyArr.size(); // ์ง์ ๊ฐ์ ์ ์ฅ
vector<int> bitmap(N, 1); memset(memo, -1, sizeof(memo));
int res = stillMoney(bitmap, 0);
bitmap = vector<int>(N, 1); memset(memo, -1, sizeof(memo));
res = max(res, stillMoney(bitmap, 1));
return res;
}
๊ฒฐ๊ณผ
1. <์ ํ์ top-down>

2. <์ ํ์ bottom-up>

3. <์ฌ๊ท - ํจ์จ์ฑ 0์ >

bitmap์ผ๋ก ์ฒดํฌํ ํ์ ์๋๋ฐ ์ฒดํฌํด์ ๊ทธ๋ฐ ๋ฏ ํ๋ค.
Comment