Koala - 19기/코딩테스트 심화 스터디
[python/백준] 13371 돌핀
ㄱㅈㅅㅇ
2025. 7. 13. 23:58
def gkatn(n):
left, right = 1, 65536
while left < right:
mid = (left + right) // 2
total = 3 * mid * (mid + 1) // 2
if total >= n:
right = mid
else:
left = mid + 1
k = left
yest = 3*(k-1)*k//2
idx = n- yest - 1
if idx < k:
return f"{k} dolphin" if k == 1 else f"{k} dolphins"
elif idx < 2 * k:
return f"{k} jump" if k == 1 else f"{k} jumps"
else:
return "splash"
def main():
t = int(input())
for _ in range(t):
n = int(input())
print(gkatn(n))
등차수열로 풀면 된다는 건 알겠는데 다해보면 시간초과 뜰 것 같았다. 열심히 고민해봤으나... 정말 모르겠어서 해석글을 찾아봤다. 근데 영어 문제라 그런가 찾아봐도 아무도 풀어두지 않았다... 자존심이 상했지만 지피티에게 털어놨다 그랬더니 지피티가 그건 이진탐색으로 찾으라그랬다. 즉, k 단계에는 3k개의 구문이 있으니(돌핀/점프/스플래시 가 각 단계의 수만큼 있음), 누적 구문은 3*k(k+1) //2 개가 있음. 예를 들어 4단계에는 3*4 = 12개의 구문이 존재하고, 4단계가 끝날때까지 총 구문 수는 3*4*5//2 = 30개 (3+6+9+12 = 30)가 있음. 나는 n이 우선 몇 단계인지 찾아야 함. 그럼 n<= 3*k(k+1) //2인 k를 찾으면 몇 단계인지 알 수 있음!
3*k(k+1) //2 <= 2 000 000 000 이면 k 가 약 65536 사이에 있고, 이제 그 사이에서 이분탐색으로 n<= 3*k(k+1) //2 이걸 조건삼아 k를 찾음. 그다음 k레벨에서 몇 번째 수인지는 직전 레벨까지의 구문 수를 n에서 빼고 +1하면 됨. 그리고 출력함