ps:problems:boj:18937
목차
왕들의 외나무다리 돌게임
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 18937 |
문제명 | 왕들의 외나무다리 돌게임 |
레벨 | 플래티넘 3 |
분류 |
스프라그-그런디 정리 |
시간복잡도 | O(n) |
인풋사이즈 | n<=100,000 |
사용한 언어 | Python |
제출기록 | 41532KB / 104ms |
최고기록 | 104ms |
해결날짜 | 2022/06/06 |
풀이
- 규칙에서 파악해야 할것은 뒤로 이동해서 상태가 더 좋아지는 경우는 없다는 것이다. 내가 뒤로 n칸 이동하면 상대는 다음턴에 앞으로 n칸 이동할수 있고, 그러면 원래 상태로 되돌아간다. 따라서 뒤로 이동하는 움직임을 배제하고 생각하면, 결국 상대와 나 사이에 빈 칸이 n개일때, k칸 앞으로 이동하는 것은, 돌이 n개 있는 무더기에서 k개를 가져가는 것과 동일하므로 님게임과 똑같이 분석하면 된다.
- 스프라그-그런디 정리를 이용해서, 각 다리의 그런디수를 구한뒤 xor해서 전체 그런디 수를 구하면 된다. 그런디 수는 상대와 나 사이의 빈칸의 갯수이므로, 총 갯수가 n칸인 다리에서 양 끝에 있는 경우 (시작 포지션)의 그런디 수는 n-2가 된다.
- n개의 다리에 대해서 그런디 수를 모두 구해서 xor하는 데에 걸리는 시간복잡도는 O(n)이다
코드
"""Solution code for "BOJ 18937. 왕들의 외나무다리 돌게임".
- Problem link: https://www.acmicpc.net/problem/18937
- Solution link: http://www.teferi.net/ps/problems/boj/18937
Tags: [Sprague-Grundy]
"""
def main():
N = int(input()) # pylint: disable=unused-variable
A = [int(x) for x in input().split()]
first_player = input()
second_player = 'Blackking' if first_player == 'Whiteking' else 'Whiteking'
grundy = 0
for a_i in A:
grundy ^= a_i - 2
print(first_player if grundy > 0 else second_player)
if __name__ == '__main__':
main()
ps/problems/boj/18937.txt · 마지막으로 수정됨: 2022/06/07 16:24 저자 teferi
토론