백준 문제풀이

9665 번 : 돌 게임

하다블 2023. 6. 23. 18:04
반응형

문제는 다음과 같습니다.

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

 

9655번: 돌 게임

상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.

www.acmicpc.net

풀이는 다음과 같습니다.

#include <iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
    
	if (n % 2 == 1) {
		cout << "SK";
	}

	else {
		cout << "CY";
	}

	return 0;
}

1개 또는 3개만 가져갈 수 있으므로 입력받은 수가 홀이냐 짝이냐에 따라 결과를 나눌 수 있습니다.

예시의 5개 경우에도

둘 다 1개씩만 가져가는 경우 5->4->3(상근 승)

상근이 3개 가져가는 경우 5->2->1(2개를 가져갈 수 없으므로 무조건 1개만 가져간다, 상근 승)

상근이 1개 가져가고 창영이 3개 가져가는 경우 5->4->1(상근 승)

이처럼 어떠한 경우에도 상근이 이기게 됩니다.

하지만 이 문제는 다이나믹 프로그래밍에 분류된 문제이기도 합니다.

다이나믹 프로그래밍으로 풀고자 하면 한 명을 기준으로 0~1000까지 (N 범위) dp를 사용하여 정의할 수 있습니다.

상근을 기준으로 이기는 경우를 1, 지는 경우를 0으로 하면

dp[0]=0;
dp[1]=1;
dp[2]=0;

1개 또는 3개를 가져가기 때문에 직접 정의해야 하는 원소 3개를 먼저 정의합니다.

그리고 이후의 값을 알아서 정의하도록 합니다.

#include <iostream>
#include <algorithm>
using namespace std;
 
int main()
{
	int n;
	int dp[1000];
	cin >> n;
	dp[0] = 0;
	dp[1] = 1;
	dp[2] = 0;
	for (int i{3}; i <= n; ++i) {
		if (min(dp[i - 1], dp[i - 3]) == 1)
			dp[i] = 0;
		else
			dp[i] = 1;
	}
	
	if (dp[n] == 1)
		cout << "SK";
	else
		cout << "CY";
        
	return 0;
}

홀짝 판별을 더 길게 늘어놓은 것 같은 코드이지만 다음과 같이 풀 수도 있습니다.

반응형

'백준 문제풀이' 카테고리의 다른 글

1735 번 : 분수 합  (0) 2023.07.19
13241 번 : 최소공배수  (0) 2023.07.14
1935 번 : 후위표기식2  (0) 2023.06.07
10866 번 : 덱  (0) 2023.06.07
9012 번 : 괄호  (0) 2023.06.07