본문 바로가기
코딩테스트_백준풀이

스티커 #9465 c++ 풀이

by wanna_dev 2023. 11. 8.

https://www.acmicpc.net/problem/9465

 

9465번: 스티커

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의

www.acmicpc.net

틀린 코드 : 

#include<iostream>
#include<cstring>
using namespace std;
int T; 
int n;
int s[2][100001];
int dp[2][100001];

int main() {
	cin >> T;
	while (T--) {
		memset(dp, 0, sizeof(dp));
		memset(s, 0, sizeof(s));

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

		dp[0][0] = s[0][0];
		dp[1][0] = s[1][0];
		
		dp[0][1] = dp[1][0] + s[0][1];
		dp[1][1] = dp[0][0] + s[1][1];

		dp[0][2] = max(dp[1][1] + s[0][2], dp[0][0]+s[1][2]);
		dp[0][2] = max(dp[0][2], dp[1][0]+s[0][2]);
		dp[1][2] = max(dp[0][1] + s[1][2], dp[1][0] + s[0][2]);
		dp[1][2] = max(dp[1][2], dp[0][0] + s[1][2]);


		int res =max(dp[0][0], dp[1][0]);
		res = max(res, dp[1][1]);
		res = max(res, dp[0][1]);
		res = max(res, dp[1][2]);
		res = max(res, dp[0][2]);
		for (int i = 3; i < n; i++) {
			dp[0][i] = max(dp[1][i-1]+s[0][i], dp[0][i-2]+s[1][i]);
			dp[0][i] = max(dp[0][i], dp[1][i-2]+s[0][i]);
			dp[1][i] = max(dp[0][i-1] +s[1][i], dp[1][i-2]+s[0][i]);
			dp[1][i] = max(dp[1][i], dp[0][i-2]+s[1][i]);
		
		    res = max(res, dp[1][n - 1]);
		    res = max(res, dp[0][n - 1]);
		}
		
		cout << res <<endl;
	}

	return 0;
}

 맞은 코드 :

#include <iostream>
#include<cstring>
using namespace std;
int T, N, result = 0;
int arr[2][100001] = { 0, };
int dp[2][100001] = { 0, };


int main() {
	cin >> T;
	for (int i = 0; i < T; i++) {
		result = 0;
		memset(dp, 0, sizeof(dp));
		memset(arr, 0, sizeof(arr));
		cin >> N;
		for (int j = 0; j < 2; j++) {
			for (int k = 0; k < N; k++) {
				cin >> arr[j][k];
			}
		}
		dp[0][0] = arr[0][0];
		dp[1][0] = arr[1][0];
		
		dp[0][1] = dp[1][0] + arr[0][1];
		dp[1][1] = dp[0][0] + arr[1][1];
		result = max(max(dp[0][0], dp[1][0]), max(dp[0][1], dp[1][1]));

		for (int j = 2; j < N; j++) {
			dp[0][j] = max(dp[1][j - 2] + arr[0][j], max(dp[1][j - 1] + arr[0][j], dp[0][j - 2] + arr[0][j]));
			dp[1][j] = max(dp[0][j - 2] + arr[1][j], max(dp[0][j - 1] + arr[1][j], dp[1][j - 2] + arr[1][j]));
			result = max(result, max(dp[0][j], dp[1][j]));
		}
		cout << result << '\n';
	}
}