1. 님 게임(Nim game)
게임이론에서 가장 중요한 게임 형태중 한가지라고 할 수 있다.
""수학적 전략 게임으로, 여러 개의 돌 무더기가 있다고 가정하자.
두 사람이 서로 차례를 번갈아가며 게임을 한다.
자신의 차례에 하나의 돌 무더기를 선택하고, 1개이상의 원하는 만큼의 돌을 제거한다.
마지막 남은 돌을 제거하는 사람이 게임에서 승리한다.""
2. 게임의 수학적 기술
현재 시점에 n개의 돌 무더기에 있는 돌의 개수가 x1,x2,...,xn이라고 하자.
내가 어떤 돌 무더기를 하나를 선택하여 돌을 가져가고 나서 변화된 돌의 개수는 y1,y2,...,yn이라고 하자.
만약 k번째의 돌 무더기를 선택하고 돌을 가져갔다면.. 돌의 개수는 줄어드니까 i=k에서 xi>yi이고,
가져가지 않은 돌 무더기라면, i≠k이면, xi=yi이다.
다음, s는 현재 돌무더기의 돌의 개수를 모두 xor한 값 s=x1⊕x2⊕...⊕xn이고,
t는 k번째 돌 무더기에서 돌을 가져가고 나서 변화된 돌의 개수를 모두 xor한 값 t=y1⊕y2⊕...⊕yn이다.
---------------------------------------------------------------------------------------------------------------
**xor연산 성질
1) xor의 항등원은 0이다.
그러니까 0과 x를 xor연산하면 x이다.
2) xor연산은 교환법칙이 성립하고, 결합법칙이 성립한다.
즉 a⊕b=b⊕a이고 a⊕(b⊕c)=(a⊕b)⊕c)
3) XOR의 역원은 XOR이다.
즉, 자기자신끼리 xor연산하면 0이다. x⊕x=0이다.
---------------------------------------------------------------------------------------------------------------------------------------------------
그러면 이제.. t=0⊕t이다. 왜냐하면 0과 자기자신 t를 xor연산하면 자기자신이기 때문이다.
그리고 0=s⊕s이다. 자기자신끼리 xor연산하면 0이기 때문이다.
그러므로, t=s⊕s⊕t이다.
여기서 s=x1⊕x2⊕...⊕xn이고, t=y1⊕y2⊕...⊕yn이다.
그러므로, t=s⊕(x1⊕x2⊕...⊕xn)⊕(y1⊕y2⊕...⊕yn)
--------------------------------------------------------------------------------------------------------------------------------
4) (a⊕b)⊕(c⊕d)=((a⊕b)⊕c)⊕d=a⊕(b⊕c)⊕d=a⊕(c⊕b)⊕d=(a⊕c)⊕(b⊕d)
교환법칙과 결합법칙을 이용해 위 식을 증명할 수 있다.
---------------------------------------------------------------------------------------------------------------------------------
4)를 이용하면, t는 다음과 같이 쓸 수 있을 것이다.
t=s⊕(x1⊕y1)⊕(x2⊕y2)...⊕(xk⊕yk)⊕...(xn⊕yn)
여기서 k는 내가 선택한 돌무더기의 번호이다.
그러므로 xk>yk이고, i≠k인 모든 i에 대하여 xi=yi이다.
자기자신끼리 xor연산은 0이고 0과 xor 연산하면 자기자신이 나오므로...
t=s⊕0⊕0⊕...(xk⊕yk)...⊕0=s⊕xk⊕yk
3. 필승전략
두 사람이 모두 최선의 방법으로 게임할때, 반드시 이기는 방법이 존재한다
"각 돌무더기에 있는 돌의 개수를 xor 연산하여, 값을 0으로 만들 수 있도록 돌을 적절하게 가져간다면 게임을 반드시 이긴다"
돌을 적절히 가져가서, 항상 돌 무더기의 돌의 개수를 모두 xor 연산한 값이 0이 되도록 다음 차례로 넘겨준다면, 게임을 반드시 이길 수 있다.
4. 증명
1) 현재 자기 차례에 돌 무더기의 돌의 개수를 xor한 값 s = 0이라고 한다면,
내가 돌을 어떻게 가져가더라도, 돌을 가져가고 나서 남은 돌 무더기의 돌의 개수를 xor한 값 t는 0이 아니다.
먼저 돌이 아예 없다면.. 즉 모든 i에 대해 xi=0이라면.. 이미 게임의 승패가 결정되었으니 의미 없다.
내가 돌을 가져갈 수 있는 상태에서, s = 0이라고 하자.
그리고 k번째 돌무더기를 선택하여 돌을 가져갔다고 한다면..
t=s⊕xk⊕yk=0⊕xk⊕yk=xk⊕yk
여기서 xk>yk이므로, t는 0이 아니다.
2) 이번엔 s가 0이 아니라고 하자.
그러면 다음 차례에 돌무더기의 돌의 개수를 모두 xor한 값 t를 0으로 만들 수 있도록 가져가는 방법의 수가 반드시 존재한다.
s를 2진법으로 나타내서 제일 왼쪽에 존재하는 1의 자리를 d라고 하자.
예를 들어 s=001011012이면 d = 6이다.
s가 0이 아니기 때문에 d가 반드시 존재한다.
이제 x1,x2,...,xn에 대하여 이들을 2진수로 모두 바꿀때, d번째 자리의 수가 1인 xk를 고르자.
이러한 xk는 반드시 존재하는데, 존재하지 않는다고 가정한다면,
모든 xi의 d번째 자리가 0인데.. 모든 xi를 xor한 값 s의 d번째 자리가 1이므로 모순이다.
왜냐하면 모든 0을 xor하면 0이어야하는데 d가 1이니까 모순
이제 yk=s⊕xk라고 가정하자.
그러니까 xk에서 어떤 수만큼 돌을 가져가서 yk로 만드는데,
그러한 yk=s⊕xk으로 만드는 방법이 반드시 존재한다는 것을 보인다.
s의 제일 왼쪽에 존재하는 1의 자리가 d이고, xk도 마찬가지이므로, d번째 이전의 자리는 모두 0이다.
따라서 둘을 xor한 결과 yk도 마찬가지로 d자리 왼쪽은 0으로 전부 똑같다.
그리고, s의 d번째 자리가 1이고 xk도 d번째 자리가 1이라고 가정했으므로, 동일한 1을 xor한 결과인 yk의 d번째 자리는 0이다.
즉, xk와 yk의 차이는 많아야 2d이다.
그리고 d번째 자리 오른쪽으로는 아무리 차이나봐야 2d−1+2d−2+...+20이다.
이는 공비가 2이고 초항이 1이며 항 수가 d개인 등비수열의 합 2d−1과 같다.

따라서 xk와 yk는 차이가 최소한 1이상이다.
그러므로 xk개가 존재하는 k번째 돌 더미에서 반드시 yk=s⊕xk가 되도록 가져가는 돌의 개수가 존재한다.
또한 그렇게 돌을 가져간다면...
t=s⊕xk⊕yk=s⊕xk⊕(s⊕xk)=0으로 만들 수 있다.
즉, 다음 차례에 돌 무더기의 돌의 개수를 xor한 값 t = 0으로 반드시 만들 수 있다.
3) 게임의 필승 전략은 돌을 적절히 가져가서 돌무더기 돌의 개수를 xor한 값이 0이 되도록 다음 차례로 넘겨준다면, 게임을 반드시 이긴다.
위에서 증명한 두가지 사실을 이용한다면..
자기 차례에 현재 존재하는 돌무더기의 돌의 개수를 xor한 값 x = 0이라면, 어떻게 하더라도, 다음 차례에 x가 0이 아니므로 게임을 이길 수 없다.
반대로 x가 0이 아니라면, 다음 차례에 반드시 x는 0으로 만들 수 있고, 그러므로 최선의 방법으로 플레이할때, 반드시 게임을 이길 수 있다.
5. 연습문제
11868번: 님 게임 2
koosaga와 cubelover가 님 게임을 하고 있다. 님 게임은 돌을 차곡 차곡 위로 쌓아올린 돌 더미 k개를 이용한다. 각각의 돌 더미에는 한 개 이상의 돌이 있다. 두 사람은 서로 턴을 번갈아가면서 님 게
www.acmicpc.net
6. 풀이
제시하는 게임은 정확히 님 게임의 원본이고..
님 게임의 필승전략을 안다면, 아주 쉽게 풀 수 있다.
현재 존재하는 돌무더기의 돌의 개수를 xor해서 0이라면 첫 시작인 사람이 게임을 지고,
0이 아니라면 첫 시작인 사람이 게임을 이긴다.
from sys import stdin
n = int(stdin.readline())
A = list(map(int,stdin.readline().split()))
z = A[0]
for i in range(1,n):
z ^= A[i]
if z == 0:
print('cubelover')
else:
print('koosaga')
참고
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=oidoman&logNo=221145674383
XOR의 마법
https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/xor.html 소개 수학에서는 포함적 OR(inc...
blog.naver.com
https://accu.org/journals/overload/20/109/lewin_1915/
All About XOR
Boolean operators are the bedrock of computer logic. Michael Lewin investigates a common one and shows there’s more to it than meets the eye. You probably already know what XOR is, but let’s take a moment to formalise it. XOR is one of the sixteen poss
accu.org
https://stackoverflow.com/questions/14279866/what-is-inverse-function-to-xor
What is inverse function to XOR?
There is XOR function in Java - a^b For exemple: 5^3 = 6 Can you tell me inverse function? If I have 6 and 3 can i get range of numbers which include number 5?
stackoverflow.com
https://math.stackexchange.com/questions/2972675/inverse-operation-of-xor
Inverse operation of xor
If x=a xor b, given the values of x and a can we find b? In other words, which function can be applied on both sides in the equation to get the value of b?
math.stackexchange.com
https://librewiki.net/wiki/%ED%95%84%EC%8A%B9_%EC%A0%84%EB%9E%B5_%EA%B2%8C%EC%9E%84
필승 전략 게임
필승 전략 게임은 어느 한 쪽이 반드시 이길 수 있는 전략을 가진 게임을 말한다.
librewiki.net
Nim game
님 게임(Nim game)은 수학적 전략 게임이다. 여러 개의 돌 무더기가 있다. 두 사람이 서로 차례를 번갈아가면서 게임한다. 자신의 차례에 하나의 돌 무더기를 선택하여 1개이상 원하는 만큼의 돌을
blog.myungwoo.kr
'알고리즘 > 게임이론' 카테고리의 다른 글
돌 무더기에서 팰린드롬(palindrome)인 정수 개수만큼 가져갈 때 이기는 방법 (0) | 2024.05.06 |
---|---|
틱택토 게임(tic tac toe)에서 가능한 모든 경우의 수를 찾는 방법 (0) | 2024.03.13 |
필승 전략 게임 - 베스킨라빈스 31 게임에서 반드시 이길 수 있을까? (0) | 2023.06.05 |
필승 전략 게임 - 돌 줍기 게임에서 반드시 이기는 방법 (0) | 2023.05.23 |
게임이론 배우기 -소수 부르기 게임- (0) | 2023.01.30 |