풀이
#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를 뗄 수 있어 최댓값을 만들 수 있기 때문에 모순
'Koala - 15기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/c++] 14495번 : 피보나치 비스무리 (0) | 2024.07.14 |
---|---|
[백준 / Python] 1965번: 상자넣기 (0) | 2024.07.12 |
[백준/python] 1932: 정수 삼각 (0) | 2024.07.12 |
[백준/java]-11053 가장 긴 증가하는 부분 수열 (0) | 2024.07.11 |
[백준/Python3] 1463번 : 1로 만들기 (0) | 2024.07.10 |