Koala - 15기/코딩테스트 준비 스터디

[백준/C++] 9465번: 스티커

alswns8081 2024. 7. 12. 18:03

풀이

#include <iostream>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin.tie(NULL);

    int T;
    cin >> T;

    while(T--) {
        int n;
        cin >> n;

        int sticker_value[2][n];

        for( int i = 0; i < 2; ++i ) {
            for( int j = 0; j < n; ++j ) cin >> sticker_value[i][j];
        }

        for( int i = 1; i < n; ++i ) {
            if( i == 1 ) {
                sticker_value[0][i] += sticker_value[1][i - 1];
                sticker_value[1][i] += sticker_value[0][i - 1];
            } else {
                sticker_value[0][i] += max(sticker_value[1][i - 1], sticker_value[1][i - 2]);
                sticker_value[1][i] += max(sticker_value[0][i - 1], sticker_value[0][i - 2]);
            }
        }

        cout << max(sticker_value[0][n - 1], sticker_value[1][n - 1]) << '\n';

    }

    return 0;
}

1) 스티커를 2n개 구매하므로, 각 스티커에 저장된 점수를 sticker_value라는 2차원 배열의 형태로 저장
2) 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 시작 부분을 고려하면, [0][1] 위치의 스티커를 떼면 [1][0] 위치의 스티커를 뗄 수밖에 없고, [1][1] 위치의 스티커를 떼면 [0][0]dml 스티커를 뗄 수밖에 없다.
3) 이후에는 max함수를 사용해서 i번째 위치의 값에 다른 행의 i-1번째 위치, i-2번째 위치(why?)의 값중 더 큰 것을 더하고 가장 큰 값을 출력한다.
-> i - 1 번째 위치와 i - 2번째 위치를 비교하는 이유는 스티커를 떼면 양 옆으로 1칸씩 사용할 수 없기에 i - 3번째 위치를 고려하면 그 전에 다른 sticker를 뗄 수 있어 최댓값을 만들 수 있기 때문에 모순