Hello Ocean! 🌼

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/C++] λ„λ‘‘μ§ˆ λ³Έλ¬Έ

Algorithm

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/C++] λ„λ‘‘μ§ˆ

bba_dda 2021. 3. 31. 13:36
λ°˜μ‘ν˜•

문제 

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

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - λ„λ‘‘μ§ˆ

도둑이 μ–΄λŠ λ§ˆμ„μ„ ν„Έ κ³„νšμ„ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ§ˆμ„μ˜ λͺ¨λ“  집듀은 μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 λ™κ·Έλž—κ²Œ λ°°μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 각 집듀은 μ„œλ‘œ μΈμ ‘ν•œ 집듀과 λ°©λ²”μž₯μΉ˜κ°€ μ—°κ²°λ˜μ–΄ 있기 λ•Œλ¬Έμ— μΈμ ‘ν•œ

programmers.co.kr

도둑이 μ–΄λŠ λ§ˆμ„μ„ ν„Έ κ³„νšμ„ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ§ˆμ„μ˜ λͺ¨λ“  집듀은 μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 λ™κ·Έλž—κ²Œ λ°°μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

각 집듀은 μ„œλ‘œ μΈμ ‘ν•œ 집듀과 λ°©λ²”μž₯μΉ˜κ°€ μ—°κ²°λ˜μ–΄ 있기 λ•Œλ¬Έμ— μΈμ ‘ν•œ 두 집을 ν„Έλ©΄ 경보가 μšΈλ¦½λ‹ˆλ‹€.

각 집에 μžˆλŠ” 돈이 λ‹΄κΈ΄ λ°°μ—΄ moneyκ°€ μ£Όμ–΄μ§ˆ λ•Œ, 도둑이 ν›”μΉ  수 μžˆλŠ” 돈의 μ΅œλŒ“κ°’μ„ κ΅¬ν•΄λ³΄μž! 

 

μ œν•œμ‚¬ν•­

  • 이 λ§ˆμ„μ— μžˆλŠ” 집은 3개 이상 1,000,000개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • money λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” 0 이상 1,000 μ΄ν•˜μΈ μ •μˆ˜μž…λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

money return
[1, 2, 3, 1] 4

풀이

DPλ₯Ό ν™œμš©ν•΄μ„œ ν’€μ΄ν•˜μ˜€λ‹€. 

cache[i] : μ‹œμž‘μ  ~ i κΉŒμ§€ λŒμ•˜μ„ λ•Œ, ν›”μΉ  수 μžˆλŠ” μ΅œλŒ€ money

cache[i] = max (cache[i-1], money[i] + cache[i-2]) λ˜λŠ”, 

cache[i] = max (cache[i+1], money[i] + cache[i+2]) 둜 계산할 수 μžˆλ‹€.

λ°”λ‘œ μ˜†μ˜ 집을 μ„ νƒν•˜λŠλƒ, ν˜„μž¬ 집과 κ·Έ μ˜†μ˜†μ§‘μ„ μ„ νƒν•˜λŠλƒ 쀑에 더 큰 것을 κ³ λ₯΄λŠ” μ…ˆμ΄λ‹€.

 

문제 쑰건에 집듀이 λ™κ·Έλž—κ²Œ λ°°μΉ˜λ˜μ–΄ μžˆλ‹€κ³  ν–ˆμœΌλ‚˜, μ‹€μ œ μ½”λ“œμ—μ„œλŠ” 일차원 λ°°μ—΄ or λ²‘ν„°λ‘œ μ‚¬μš©λ˜λ―€λ‘œ 

이 λ¬Έμ œλŠ” 크게 μ„Έ 가지 경우둜 λ‚˜λˆ„μ–΄λ³Ό 수 μžˆλ‹€. 

(λ°°μ—΄μ—μ„œμ˜ μ‹œμž‘μ κ³Ό 끝 집을 λͺ¨λ‘ ν„Έ 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€)

 

1. 첫번째 집을 ν„Έκ³ , λ§ˆμ§€λ§‰ 집을 μ•ˆ ν„°λŠ” 경우 

2. 첫번째 집을 μ•ˆν„Έκ³ , λ§ˆμ§€λ§‰ 집을 ν„°λŠ” 경우

3. 첫번째 집, λ§ˆμ§€λ§‰ 집 λͺ¨λ‘ μ•ˆ ν„°λŠ” 경우 

μ™Όμͺ½λΆ€ν„° 1,2,3 case

 

1번 case (첫집 O, λ§ˆμ§€λ§‰μ§‘ X) 2번 case (첫집 X, λ§ˆμ§€λ§‰μ§‘ O)  3번 case (첫집 X, λ§ˆμ§€λ§‰μ§‘ X) 

μ„Έ 가지 case 쀑에 μ΅œλŒ“κ°’μ€ 첫 번째, λ‘λ²ˆμ§Έ case의 9이닀. λ”°λΌμ„œ 닡은 9이닀. 

μ½”λ“œ

#include <string>
#include <vector>
#include <algorithm>

using namespace std;



int solution(vector<int> money) {
	int answer = 0;
	int n = money.size();
    vector<int> cache(n);
	// 무쑰건 첫집 O, λ§ˆμ§€λ§‰ 집 X
    cache[0] = money[0];
    cache[1] = money[0]; 
    for (int i=2;i<n-1;i++){
        cache[i] = max(cache[i-1], money[i]+cache[i-2]);
    }
    answer = *max_element(cache.begin(),cache.end());
    
    // 첫집 X, λ§ˆμ§€λ§‰μ§‘ 0
    fill(cache.begin(),cache.end(),0);
    cache[n-1] = money[n-1];
    cache[n-2] = money[n-1];
    for (int i=n-3;i>0;i--){
        cache[i] = max(cache[i+1], money[i]+cache[i+2]);
    }
    answer = max(answer, *max_element(cache.begin(),cache.end()));
    //λ‘˜λ‹€ X
    fill(cache.begin(),cache.end(),0);
    cache[1] = money[1];
    for (int i=2;i<n;i++){
        cache[i] = max(cache[i-1], money[i]+cache[i-2]);
    }
    answer = max(answer, *max_element(cache.begin(),cache.end()));
	return answer;
}

κ²°κ³Ό

λ°˜μ‘ν˜•