2026년 1월 7일~8일에 진행한 Hello 2026에 참가했습니다. 이번에도 3문제를 풀었습니다. Goodbye, BOJ! 2025부터 항상 3문제밖에 풀지 못하고 있는데, 다행히 레이팅이 오르기는 했습니다.
제출: 5분
첫 문제입니다. 조건을 잘 생각해 보면 Alice가 승리하는 것은 Alice가 첫 번째 차례에 개 미만의 수를 합치는 것으로 모든 수를 로 만들 수 있는 것과 동치입니다. 그렇지 못하면 Bob이 모든 수를 합쳐 로 만들 테니까요. 이것을 만족하기 위해서는 배열 양 끝의 두 수 중 적어도 하나는 이어야 합니다. 이것을 판정하여 AC를 받았습니다.
제출: 33분
두 번째 문제입니다. 처음에 연산을 보고 좀 쫄아서(?) 오래 걸리게 되었습니다. 잘 생각해 보면 개의 수를 남겼을 때 가능한 의 최댓값은 입니다. 이제 가 가 되도록 삭제 연산을 한다고 합시다. 배열에 이하의 모든 수가 존재한다면, 각 연산마다 중복이 있거나 보다 큰 수를 제거하여 를 로 만들 수 있습니다. 하지만 이하의 수 중 배열에 없는 것이 있다면 이는 불가능하죠. 따라서 이 답이 됩니다.
제출: 96분, 97분
세 번째 문제입니다. 처음에는 병사를 가까운 곳부터 한 명씩 차례대로 옮기는 비효율적인 방식으로 생각하여 오래 걸렸습니다. 이 방식으로는 의 시간 동안 개의 기지를 차지할 수 있지만, 개의 기지를 차지하는 방법이 있습니다. 하지만 case work가 많아 지문으로 설명하기 곤란한 관계로, 평소와는 달리 정답 코드를 첨부합니다. 한 번 틀린 것은 ⑴에 있는 continue문을 쓰지 않고 제출해서 그렇습니다.
import sys
input = sys.stdin.readline
for _ in range(int(input())):
n, m, k = map(int, input().split())
if m == 1:
print(min(n, 2))
continue
elif m == 2:
if n <= 2:
print(n)
elif k == 1 or k == n:
print(2)
else:
print(3)
continue # ⑴
s = min(k - 1, n - k)
l = max(k - 1, n - k)
if m // 3 <= s - 1:
print(m - m // 3 + 1)
else:
x = min((m - s + 1) // 2, l)
print(s + x + 1)
이렇게 해서 2518점의 점수를 획득하였으며, 퍼포먼스는 1485였습니다. 레이팅은 3점이 오른 1502로, 가까스로 1500대에 재진입했습니다. 그래도 올랐으면 된 거 아닐까요.