Make Unreal REAL.
article thumbnail
Level 3. 스티커 모으기(2)

 

 

 

[프로그래머스 lv3] 스티커 모으기(2) (DP 풀이)

Summer/Winter Coding(~2018) 문제입니다. 문제 설명 N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다. 원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어

latte-is-horse.tistory.com

 

DP 문제라는 생각은 들었지만, 막상 풀이가 바로 떠오르지는 않았다.

 

DP 문제에서는 DP 테이블의 의미를 정확히 아는 것이 중요하다.

  • 이 문제에서는 i번째까지 스티커를 때었을 때 최댓값을 저장한다.

 

처음에는 2가지를 고려해야 한다.

  • 첫 번째 스티커를 뜯고 시작하거나, 뜯지 않고 시작하거나

 

진행하면서는 2가지를 고려한다.

  • i번째 스티커를 뜯거나, 뜯지 않거나
  • 뜯는 경우에는 DP[i] = DP[i - 2] + sticker[i]가 된다.

 

#include <iostream>
#include <vector>
#include <algorithm>

#define I(i) (((i) + n) % n)

using namespace std;

int solution(vector<int> sticker)
{
    if (sticker.size() <= 1)
        return sticker[0];

    size_t n = sticker.size();
    vector<int> d1(n, 0), d2(d1);

    d1[1] = d1[0] = sticker[0];
    
    for (int i = 2; i < n - 1; ++i)
        d1[i] = max(d1[i - 2] + sticker[i], d1[i - 1]);

    for (int i = 1; i < n; ++i)
        d2[i] = max(d2[I(i - 2)] + sticker[i], d2[i - 1]);

    return max(d1[I(-2)], d2[I(-1)]);
}

'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 2. 이모티콘 할인행사  (0) 2023.09.07
Level 2. N-Queen  (0) 2023.09.06
Level 3. 경주로 건설  (0) 2023.09.04
Level 3. 보석 쇼핑  (0) 2023.09.03
Level 2. 광물 캐기  (0) 2023.09.02
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그