728x90
SMALL
백준 문제 풀이: 9657 (돌 게임 3)
문제 링크: https://www.acmicpc.net/problem/9657
문제 설명:
돌 게임 3은 상근이와 창영이가 번갈아가며 게임을 진행하는 게임입니다. 한 번의 턴에서 돌을 1개, 3개, 혹은 4개 가져갈 수 있습니다. 마지막 돌을 가져가는 사람이 승리하며, 시작하는 사람이 이길 수 있는지 확인합니다. - "SK"는 상근이가 승리, "CY"는 창영이가 승리입니다.
문제 해결 코드
#include <iostream>
using namespace std;
int dp[1001]; // dp[i]: 돌이 i개 남았을 때 승리하는 사람 (1: SK, 2: CY)
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
dp[1] = 1; // 돌 1개: SK 승리
dp[2] = 2; // 돌 2개: CY 승리
dp[3] = 1; // 돌 3개: SK 승리
dp[4] = 1; // 돌 4개: SK 승리
// DP 배열 채우기
for (int i = 5; i <= n; i++) {
if (dp[i - 1] == 1 && dp[i - 3] == 1 && dp[i - 4] == 1) {
dp[i] = 2; // SK가 돌을 가져가도 CY가 이길 수 있는 경우
} else {
dp[i] = 1; // SK가 돌을 가져가서 SK가 이길 수 있는 경우
}
}
// 결과 출력
if (dp[n] == 1) {
cout << "SK";
} else {
cout << "CY";
}
}
코드 설명
- 초기값 설정: - 돌이 1개일 때: SK가 가져가 승리 - 돌이 2개일 때: CY가 마지막 돌을 가져가 승리 - 돌이 3개, 4개일 때: SK가 모두 가져가 승리
- DP 배열 채우기: - dp[i - 1], dp[i - 3], dp[i - 4]가 모두 SK가 승리하는 경우라면, CY가 승리합니다. - 반대로, dp[i - 1], dp[i - 3], dp[i - 4] 중 하나라도 CY가 승리한다면, SK가 이길 수 있습니다.
시간 복잡도 분석
- DP 배열을 1부터 n까지 채우므로 시간 복잡도는 O(n)입니다.
입출력 예시
- 입력 예시:
6
- 출력 예시:
CY
- 설명: 돌이 6개일 때, SK가 돌을 가져가면 CY가 이길 수 있는 선택을 할 수 있습니다.
결론
이 문제는 동적 프로그래밍(DP)을 이용해 각 돌의 개수에서 누가 이길 수 있는지 판단하는 문제입니다. 각 단계에서 상대방의 승패를 이용해 현재 상황에서의 승자를 결정하는 방식으로 효율적으로 해결할 수 있습니다.
728x90
LIST
'BAEKJOON > 다이나믹 프로그래밍' 카테고리의 다른 글
백준 1699번 [제곱수의 합](C++) -yes6686- 티스토리 (0) | 2024.02.10 |
---|---|
백준 9655번 [돌 게임](C++) -yes6686- 티스토리 (0) | 2024.02.08 |
백준 1788번 [피보나치 수의 확장](C++) -yes6686- 티스토리 (0) | 2024.02.05 |
백준 2293번 [동전 1](C++) -yes6686- 티스토리 (0) | 2024.02.03 |
백준 11057번 [오르막 수](C++) -yes6686- 티스토리 (0) | 2024.02.02 |