본문 바로가기

Algorithm/PS

[1일 1알고] 도둑질

https://school.programmers.co.kr/learn/courses/30/lessons/42897

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

오늘은 간단한 문제입니다.

 

가장 일반적인 dp문제를 아주 쪼끔 비틀었는데요

 

dp[i] = max(dp[i-1], dp[i-2] + val); 로 이루어지는 점화식을 활용합니다.

 

원형으로 이루어져있기 때문에 끝과 끝이 만나는 지점의 처리방법만 생각하면 됩니다.

 

간단하게 첫 집을 고르는 경우와 고르지 않는 경우를 나눠 계산한다면 마지막 집을 선택할 수 있는 가능성이 있는것, 없는 것으로 나누어지고 이에 따라 dp를 계산하면 정답이 나오게 됩니다.

 

#include <string>
#include <vector>

using namespace std;
int GetResult(const vector<int>& money, int start, int end)
{
    int prev2 = 0;
    int prev1 = 0;

    for (int i = start; i <= end; ++i)
    {
        int cur = max(prev1, prev2 + money[i]);
        prev2 = prev1;
        prev1 = cur;
    }

    return prev1;
}


int solution(vector<int> money) {
    int answer = 0;
    int N = money.size();

    int case1 = GetResult(money, 0, N - 2);
    int case2 = GetResult(money, 1, N - 1);

    return max(case1, case2);
}

'Algorithm > PS' 카테고리의 다른 글

[1일 1알고] 기둥과 보 설치  (0) 2026.05.08
[1일 1알고] 베스트앨범  (0) 2026.05.07
[1일 1알고] 택배 배달과 수거하기  (0) 2026.05.05
[1일 1알고] 카드 짝 맞추기  (0) 2026.05.05
[1일 1알고] 주차 요금 계산  (0) 2026.05.03