https://www.acmicpc.net/problem/24678
24678번: 돌무더기 게임 1
첫 번째 케이스에서 R의 첫 시행 이후 가능한 다음 상태는 $(0,0,2), (0,2,0), (2,0,0)$뿐이며, B는 더 이상 시행을 할 수 없으므로 이긴다. 두 번째 케이스에서 R의 첫 시행 이후 가능한 다음 상태는 다음
www.acmicpc.net
풀이를 한 100줄 쓴 거 같은데...
쓰다가 다 지워버렸다.
너무 간단한 풀이가 생각나서
돌무더기가 내 차례에
짝수 짝수 짝수
상태로 놓여있다고 생각해보자
그럼 상대편 차례일때는 무조건
홀수 홀수 홀수
일 것이다.
왜냐하면 각 돌무더기에 대해 돌 하나를 가져가거나 올려놓거나 하니까 짝수는 홀수로 홀수는 짝수로 바꾸는 거다.
그리고 내 차례엔 무조건
짝수 짝수 짝수
일 것이다.
즉, 게임의 진행도와 관계없이 자기 차례에서 짝수 개수와 홀수 개수는 보존된다.
이 게임에서 이기려면 돌무더기 상태가 내 차례에
0 0 0 또는 0 0 X 상태여야 하는데 (X는 자연수 아무거나 가능)
0은 짝수라서 상대편 차례일 땐 이 상태가 찾아올 가능성이 전혀 없다.
그래서
짝수 짝수 짝수 인 경우엔 내가 이긴다.
같은 원리로,
짝수 짝수 홀수 인 경우엔 내가 이기고,
홀수 홀수 홀수 또는
홀수 홀수 짝수 인 경우엔 내가 진다.
내 차례에 돌 개수가 짝수개인 돌무더기가 3개 이상이면 무조건 내가 이기는 거다.
이 간단한 풀이를 맞았습니다!!를 받은 지 30분 후에야 생각해냈다. 아마 이게 문제 의도였을 거다.
다음은 C언어로 구현한 것 ......
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
int main()
{
int t, x;
scanf("%d", &t);
for (int i = 0;i < t;i++)
{
int count = 0;
for (int j = 0;j < 3;j++)
{
scanf("%d", &x);
if (x % 2 == 1)
count++;
}
if (count > 1)
printf("B\n");
else
printf("R\n");
}
}
|
cs |
'problem solving' 카테고리의 다른 글
백준 3358: Tower of coins (0) | 2023.02.24 |
---|---|
백준 16888: 루트 게임 (0) | 2023.02.24 |
백준 26156: 나락도 락이다 (3) | 2023.02.23 |
백준 11390: 맛있는 과자 (0) | 2023.02.21 |
백준 19847: 여우 신탁 (0) | 2023.02.21 |