[백준 12943] 턴 게임 [Java]
2025. 11. 2. 17:54ㆍPS 풀이/Baekjoon Online Judge
문제
요약
- i번째 턴을 승리하면 i점을 얻을 때 정확히 x, y점을 만들 수 있는지 확인 후 x를 만들기 위한 최소 승리 횟수를 구하자.
- 불가능한 경우에는 -1을 출력하자.
- 0 ≤ x, y ≤ $10^{12}$
풀이 과정
아이디어
x, y가 유효하기 위한, $x + y = \frac{n(n+1)}{2}$를 만족하는 $n$을 찾아야 합니다.
final long N = (long) Math.sqrt(2 * (x + y));
if (N * (N + 1) / 2 != x + y) {
return -1;
}
x를 만들기 위한 최소 승리 횟수를 구하기 위해서는, n ~ 1을 순차 탐색하며 x를 만들기 위한 수를 차례대로 선택하면 됩니다.
x보다 큰 수가 만들어지면 안되는 점에 유의해야 합니다.
long sum = 0L, cnt = 0L;
for (long i = N; i >= 1; --i) {
if (sum + i <= X) {
sum += i;
++cnt;
if (sum == X) break;
}
}
최적화
sum + i가 X보다 크다면, i보다 작은 X - sum을 선택하면 됩니다.
if (sum == X) return cnt;
if (sum + i <= X) {
sum += i;
++cnt;
} else {
return cnt + 1;
}
성능 분석
- 시간 복잡도: O(N)
- 제출결과: Accepted / 108ms(≤ 2s) / 14152KB
참고
문제
소스코드
https://github.com/rogi-rogi/problem-solving/blob/main/baekjoon-online-judge/normal/12934.java
'PS 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
| [백준 16719] ZOAC [Java] (0) | 2025.11.07 |
|---|---|
| [백준 01022] 소용돌이 예쁘게 출력하기 [Java] (0) | 2025.11.06 |
| [백준 15226] House of Cards [Java] (0) | 2025.10.30 |
| [백준 01034] 램프 [Java] (0) | 2025.10.26 |
| [백준 15550] if 2 [Java] (0) | 2025.10.25 |