반응형
문제
https://www.acmicpc.net/problem/12934
문제 설명
- 각 턴으로 이루어진 게임이 존재한다.
- 턴은 1턴부터 시작해서 n턴까지 이루어져 있다.
- i턴의 승자에게 i점의 점수가 부여된다.
- 윤호와 동혁이의 점수 x와 y가 주어진다.
- 게임을 진행했을 때 윤호가 x점, 동혁이가y점이 될 수 있는지 판별한다.
- 게임이 가능하다면 윤호가 최소 몇 번 이겨야 하는지도 구한다.
풀이
- x와 y의 최대 값은 $10^{12}$이다.
- 나올 수 있는 최댓 값 $x=$ $10^{12}$ , $y=$ $10^{12}$ 일 때를 기준으로 현재 점수가 진행 가능한 게임인지 판별한다.
- 불가능하다면 -1을 출력한다.
- 게임 진행이 가능하다면 진행 가능한 최대 턴 수를 구한다.
- 게임을 이겨야 하는 최소 횟수를 구한다.(n턴)
- 최소 횟수가 되기 위해서는 n부터 1까지 x가 될 때까지 큰 수부터 차례대로 더한다.
코드
import sys
x,y = map(int,input().split())
MAX_SIZE = (10**12)*2
max_count = 0
num = 0
make = 0
for i in range(1, MAX_SIZE+1):
if num == (x + y):
make = 1
break
if num + i > MAX_SIZE:
break
max_count += 1
num += i
if not make:
print(-1)
else:
res = 0
cnt = 0
for i in range(max_count, 0,-1):
if res + i <= x:
res += i
cnt += 1
if res == x:
break
print(cnt)
시간복잡도
- 최대 진행 가능 한 턴을 구할 때 최댓값인 $x=$ $10^{12}$ , $y=$ $10^{12}$일 때 총 1999999회, 즉 $O(10^6)$ 정도의 시간복잡도가 소요된다.
- 최소 몇 번 이겨야 할 지 계산할 때도 최댓값인 $10^6$회를 모두 탐색한다고 한다면 마찬가지로 $O(10^6)$ 정도의 시간복잡도가 소요된다.
- 따라서 약 $O(10^6)$의 시간복잡도를 가진다.
반응형
'알고리즘' 카테고리의 다른 글
| [파이썬/python] 백준 - 20112 사토르 마방진 (0) | 2025.06.27 |
|---|---|
| [파이썬/python] 백준 - 32200 항해 (0) | 2025.06.26 |
| [파이썬/python] 백준 - 10844 쉬운 계단 수 (0) | 2025.02.07 |
| [파이썬/python] 백준 - 10425 피보나치 인버스 (0) | 2025.02.06 |
| [파이썬/python] 백준 - 15801 풍선 공장 (0) | 2025.02.05 |