λ¬Έμ
λ¬Έμ μ€λͺ
λλμ΄ μ΄λ λ§μμ νΈ κ³νμ νκ³ μμ΅λλ€. μ΄ λ§μμ λͺ¨λ μ§λ€μ μλ κ·Έλ¦Όκ³Ό κ°μ΄ λκ·Έλκ² λ°°μΉλμ΄ μμ΅λλ€.
κ° μ§λ€μ μλ‘ μΈμ ν μ§λ€κ³Ό λ°©λ²μ₯μΉκ° μ°κ²°λμ΄ μκΈ° λλ¬Έμ μΈμ ν λ μ§μ νΈλ©΄ κ²½λ³΄κ° μΈλ¦½λλ€.
κ° μ§μ μλ λμ΄ λ΄κΈ΄ λ°°μ΄ moneyκ° μ£Όμ΄μ§ λ, λλμ΄ νμΉ μ μλ λμ μ΅λκ°μ return νλλ‘ solution ν¨μλ₯Ό μμ±νμΈμ.
μ νμ¬ν
- μ΄ λ§μμ μλ μ§μ 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λ²μ§Έ <μ¬κ·ν¨μ> μ½λ
μ½λ
<μ νμ 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;
}
<μ νμ 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;
}
μ€λ΅μ½λ <μ¬κ·ν¨μ>
#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;
}
κ²°κ³Ό
<μ νμ top-down>
<μ νμ bottom-up>
<μ¬κ· - ν¨μ¨μ± 0μ >
bitmapμΌλ‘ 체ν¬ν νμ μλλ° μ²΄ν¬ν΄μ κ·Έλ° λ― νλ€.
λ°μν
Comment