목차

31게임

ps
링크acmicpc.net/…
출처BOJ
문제 번호4148
문제명31게임
레벨골드 3
분류

게임 이론

시간복잡도O(n*m^n + t)
인풋사이즈t<=?, n<=6, m<=4, t
사용한 언어Python 3.11
제출기록34196KB / 80ms
최고기록76ms
해결날짜2023/07/21

풀이

코드

"""Solution code for "BOJ 4148. 31게임".

- Problem link: https://www.acmicpc.net/problem/4148
- Solution link: http://www.teferi.net/ps/problems/boj/4148

Tags: [game theory]
"""

import functools
import sys


@functools.cache
def is_win_pos(used, card_sum):
    for i in range(1, 7):
        if card_sum + i <= 31 and used[i] < 4:
            used_list = list(used)
            used_list[i] += 1
            if not is_win_pos(tuple(used_list), card_sum + i):
                return True
    return False


def main():
    for inp in sys.stdin:
        inp = inp.rstrip()
        used = [0] * 7
        card_sum = 0
        for c in inp:
            used[int(c)] += 1
            card_sum += int(c)
        player, opponent = ('A', 'B') if len(inp) % 2 == 0 else ('B', 'A')
        print(inp, player if is_win_pos(tuple(used), card_sum) else opponent)


if __name__ == '__main__':
    main()