[파이썬/python] 백준 - 4370 곱셈 게임

2026. 3. 16. 18:36·알고리즘
반응형

문제

https://www.acmicpc.net/problem/4370


문제 설명

  1. 백준이와 동혁이는 곱셈 게임을 한다.
    1. 이 게임은 정수 p에 2~9사이의 숫자 중 하나를 곱하면 되는 게임이다.
    2. p = 1로 시작하고, n을 정한다.
  2. 백준이부터 무조건 게임을 시작한다.(번갈아가면서 2~9사이의 수를 곱한다.)
  3. 이 때 p ≥ n에 먼저 도달하는 사람이 이기게 된다.
  4. 둘 모드 완벽하게 게임을 한다고 가정할 때 이기는 사람이 누구인지 구한다.

 


풀이

이 문제는 결국 백준이와 동혁이가 서로 최선의 선택을 반복했을 때 누가 먼저 n에 도달하느냐를 구하는 문제이다.

 

처음 문제를 봤을 때 가장 어려웠던 부분은 최선의 선택이 무엇인지 파악하는 것이었다.

 

그래서 먼저 게임의 흐름을 단계별로 정리했다.

 

우선 게임은 항상 백준이가 선공으로 시작한다.

p = 1에서 시작하고 각 턴마다 2부터 9 사이의 숫자를 곱할 수 있으며, p ≥ n이 되는 순간 그 턴의 플레이어가 승리한다.

 

이 조건을 기준으로 각 라운드에서 누가 이길 수 있는지 범위를 직접 확인해 보면 다음과 같은 패턴이 보인다.

 

1라운드

백준이는 처음 턴에서 p에 2부터 9 사이의 숫자를 곱할 수 있다.

따라서 n ≤ 9라면 백준이가 한 번의 턴으로 바로 p ≥ n을 만들 수 있기 때문에 무조건 승리한다.

 

즉 1 ≤ n ≤ 9 구간에서는 백준이의 승리이다.

 

2라운드

만약 n이 10 이상이라면 백준이는 첫 턴에서 바로 승리할 수 없다.

 

이 경우 백준이는 가능한 한 크게 값을 늘리기 위해 9를 곱한다고 생각할 수 있다.
그러면 p = 9가 되고 다음 턴은 동혁이의 차례가 된다.

 

동혁이는 자신의 턴에서 2부터 9까지의 숫자를 곱할 수 있기 때문에 최대 9 × 2 = 18까지 만들 수 있다.

따라서 10 ≤ n ≤ 18 범위에서는 동혁이가 무조건 승리할 수 있다.

 

3라운드

n이 19 이상이라면 동혁이도 바로 승리할 수 없다.

 

이 경우 다시 백준이의 턴이 오게 되고, 백준이는 다시 가능한 한 크게 값을 늘리기 위해 9를 곱한다고 볼 수 있다.

즉 18 × 9 = 162이 되기 때문에 19 ≤ n ≤ 162 범위에서는 백준이가 승리하게 된다.

 

이와 같은 방식으로 게임의 흐름을 계속 확장해 보면 다음과 같은 패턴이 반복된다.

 

백준이 턴 → p에 9를 곱한다.
동혁이 턴 → p에 2를 곱한다.

 

결국 p는 다음과 같은 형태로 증가한다.

 

1 → 9 → 18 → 162 → 324 → ...

 

따라서 매 단계마다

 

9를 곱했을 때 p ≥ n 이 되면 백준이의 승리
2를 곱했을 때 p ≥ n 이 되면 동혁이의 승리

 

라고 정리할 수 있다.

 

이 과정을 반복하면서 p가 n 이상이 되는 순간을 확인하면 승자를 결정할 수 있다.

 

그래서 p를 1에서 시작해 9와 2를 번갈아 곱하면서 n 이상이 되는 시점을 확인하도록 반복문으로 구현했다.

알고보면 어렵지 않은데 규칙 찾는게 어렵게 느껴진 문제였다..

 

 

 


코드

import sys
input = sys.stdin.readline

winner = { 2: 'Donghyuk wins.', 9: 'Baekjoon wins.'}

while True:
    try:
        n = int(input())
    except: 
        exit()

    p = 1
    end = 0

    while not end:
        for i in [9,2]:
            p *= i

            if p >= n:
                print(winner[i])
                end = 1
                break

시간복잡도

  • 두 명이 한 번 플레이 할 때마다 18배씩 커지게 된다.
  • 따라서 $p = 18^k$라고 가정한다면 $p ≥ n$이므로 $18^k ≥ n$이다.
  • 양변에 $log_{18}$을 취하게 되면 $k ≥ log_{18}n$ 따라서  $O(logn)$만큼의 시간복잡도를 가지게 된다.
  • n은 최악의 경우 4294967295, 약 $2^{32}$이다. 따라서 약 7~8회 정도 실행되기 때문에 $O(1)$에 가깝게 소요되지 않을까 싶다.
반응형

'알고리즘' 카테고리의 다른 글

[파이썬/python] 백준 - 17099 Contest  (0) 2026.04.10
[파이썬/python] 백준 - 15553 난로  (0) 2026.03.19
[파이썬/python] 백준 - 1548 부분 삼각 수열  (0) 2026.03.15
[파이썬/python] 백준 - 28283 해킹  (0) 2026.03.14
[파이썬/python] 백준 - 25195 Yes or yes  (0) 2026.03.14
'알고리즘' 카테고리의 다른 글
  • [파이썬/python] 백준 - 17099 Contest
  • [파이썬/python] 백준 - 15553 난로
  • [파이썬/python] 백준 - 1548 부분 삼각 수열
  • [파이썬/python] 백준 - 28283 해킹
개골개굴
개골개굴
굶고 코딩하기
  • 개골개굴
    밥스토리
    개골개굴
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (162) N
      • SW 마에스트로 (0)
      • 알고리즘 (125) N
      • CS (13)
      • Java (6) N
      • 자기개발 (18)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    컴퓨터 구조
    백준
    JPA
    알고리즘
    java
    python
    Redis
    작심삼일 챌린지
    파이썬
    OS
    SMTP
    completablefuture
    컴퓨터구조
    async
    springboot
    인프런
  • 최근 댓글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
개골개굴
[파이썬/python] 백준 - 4370 곱셈 게임
상단으로

티스토리툴바