※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 23974번 문제인 짝수 게임이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/23974
23974번: 짝수 게임
첫째 줄에 동전의 개수 N과 K가 주어진다. (0 ≤ N ≤ 1, 1 ≤ K ≤ 10,000,000)
www.acmicpc.net
이 게임에서 현재 윤구의 차례인 경우, 윤구가 어떤 경우에 이길 수 있는지를 잘 생각해보자.
1. 윤구가 짝수개의 동전을 앞으로 가져와야 하는 경우, 다음 중 적어도 하나 이상의 상황을 만족해야 윤구가 이길 수 있다.
(1) 윤구가 한 개의 동전을 가져오고 상대가 다음에 동전을 1~4개 중 어떤 개수로 가져가도 앞으로 항상 홀수 개의 동전을 가져올 수 있다.
(2) 윤구가 두 개의 동전을 가져오고 상대가 다음에 동전을 1~4개 중 어떤 개수로 가져가도 앞으로 항상 짝수 개의 동전을 가져올 수 있다.
(3) 윤구가 세 개의 동전을 가져오고 상대가 다음에 동전을 1~4개 중 어떤 개수로 가져가도 앞으로 항상 홀수 개의 동전을 가져올 수 있다.
(4) 윤구가 네 개의 동전을 가져오고 상대가 다음에 동전을 1~4개 중 어떤 개수로 가져가도 앞으로 항상 짝수 개의 동전을 가져올 수 있다.
2. 윤구가 홀수개의 동전을 앞으로 가져와야 하는 경우, 다음 중 적어도 하나 이상의 상황을 만족해야 윤구가 이길 수 있다.
(1) 윤구가 한 개의 동전을 가져오고 상대가 다음에 동전을 1~4개 중 어떤 개수로 가져가도 앞으로 항상 짝수 개의 동전을 가져올 수 있다.
(2) 윤구가 두 개의 동전을 가져오고 상대가 다음에 동전을 1~4개 중 어떤 개수로 가져가도 앞으로 항상 홀수 개의 동전을 가져올 수 있다.
(3) 윤구가 세 개의 동전을 가져오고 상대가 다음에 동전을 1~4개 중 어떤 개수로 가져가도 앞으로 항상 짝수 개의 동전을 가져올 수 있다.
(4) 윤구가 네 개의 동전을 가져오고 상대가 다음에 동전을 1~4개 중 어떤 개수로 가져가도 앞으로 항상 홀수 개의 동전을 가져올 수 있다.
위의 내용을 코드로 구현하여 초기값을 집어넣고 K에 따라 윤구가 이길지 질지를 출력해보면 규칙을 발견할 수 있다. 그 규칙을 코드로 작성하여 문제를 해결하자.
아래는 규칙을 발견하기 위해 사용한 코드이다.
#include <iostream>
using namespace std;
int odd[1000];
int even[1000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
odd[1] = odd[2] = odd[3] = odd[4] = odd[7] = 1;
even[0] = even[2] = even[3] = even[4] = even[5] = even[6] = 1;
for (int i = 8; i < 1000; i++) {
if (odd[i - 2] && odd[i - 3] && odd[i - 4] && odd[i - 5]) even[i] = 1;
if (even[i - 3] && even[i - 4] && even[i - 5] && even[i - 6]) even[i] = 1;
if (odd[i - 4] && odd[i - 5] && odd[i - 6] && odd[i - 7]) even[i] = 1;
if (even[i - 5] && even[i - 6] && even[i - 7] && even[i - 8]) even[i] = 1;
if (even[i - 2] && even[i - 3] && even[i - 4] && even[i - 5]) odd[i] = 1;
if (odd[i - 3] && odd[i - 4] && odd[i - 5] && odd[i - 6]) odd[i] = 1;
if (even[i - 4] && even[i - 5] && even[i - 6] && even[i - 7]) odd[i] = 1;
if (odd[i - 5] && odd[i - 6] && odd[i - 7] && odd[i - 8]) odd[i] = 1;
}
for (int i = 0; i < 1000; i++) cout << even[i] << ' ';
cout << '\n';
for (int i = 0; i < 1000; i++) cout << odd[i] << ' ';
}
'BOJ' 카테고리의 다른 글
[BOJ 6515 // C++] Frequent values (0) | 2022.01.29 |
---|---|
[BOJ 23256 // C++] 성인 게임 (0) | 2022.01.28 |
[BOJ 23255 // C++] 구름다리 2 (0) | 2022.01.26 |
[BOJ 23975 // C++] 정훈이는 민트초코맛 짜장라면이 먹고 싶다 (0) | 2022.01.25 |
[BOJ 7677 // C++] Fibonacci (0) | 2022.01.24 |