ps:problems:boj:11872
                님 게임 나누기
| ps | |
|---|---|
| 링크 | acmicpc.net/… | 
| 출처 | BOJ | 
| 문제 번호 | 11872 | 
| 문제명 | 님 게임 나누기 | 
| 레벨 | 플래티넘 3 | 
| 분류 | 
 스프라그-그런디 정리  | 
	
| 시간복잡도 | O(n) | 
| 인풋사이즈 | n<=100 | 
| 사용한 언어 | Python | 
| 제출기록 | 30840 KB / 72ms | 
| 최고기록 | 64ms | 
| 해결날짜 | 2022/05/28 | 
풀이
- 님 게임의 변형. 스프라그-그런디 정리를 이용해서 푼다.
 - 한개의 무더기에서 돌의 갯수에 따른 그런디 수를 구하는 것이 조금 복잡하다. 두 무더기로 나눴을때의 그런디수는, 두개의 그런디수를 xor한 값으로 계산할수 있고, 이렇게 두 무더기로 나누는 행동까지 포함한 그런디 수를 손으로 구해보면 1,2,4,3,5,6,8,7,…과 같은 패턴으로 나타나진다. 패턴대로 그런디수를 구한다면 돌 갯수 % 4 에 따라서 조건을 분리해주면 되긴 한다. 다만 손으로 해서 이런 패턴이 나오긴 했지만, 왜 이런 패턴이 나타나는지에 대한 설명은 모르겠다..
 - 시간복잡도는 O(n)
 
코드
"""Solution code for "BOJ 11872. 님 게임 나누기".
- Problem link: https://www.acmicpc.net/problem/11872
- Solution link: http://www.teferi.net/ps/problems/boj/11872
Tags: [Sprague-Grundy]
"""
def main():
    M = int(input())  # pylint: disable=unused-variable
    P = [int(x) for x in input().split()]
    grundy = 0
    for p_i in P:
        match p_i % 4:
            case 0:
                grundy_i = p_i - 1
            case 3:
                grundy_i = p_i + 1
            case _:
                grundy_i = p_i
        grundy ^= grundy_i
    print('koosaga' if grundy else 'cubelover')
if __name__ == '__main__':
    main()
ps/problems/boj/11872.txt · 마지막으로 수정됨: 2022/05/28 16:10 저자 teferi
                
                
토론