사용자 도구

사이트 도구


ps:problems:boj:18937

왕들의 외나무다리 돌게임

ps
링크https://www.acmicpc.net/problem/18937
출처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()

토론

댓글을 입력하세요:
V W M J X
 
ps/problems/boj/18937.txt · 마지막으로 수정됨: 2022/06/07 16:24 저자 teferi