[백준/파이썬] 1011번 Fly me to the Alpha Centauri 풀이

업데이트:



문제 정보


풀이

문제

거리 d를 이동할 때 이동량이 ... 1,2,3,3,2,1 ...처럼 증가 후 감소하는 패턴 제약이 있습니다.

주어진 시작/도착 좌표에서 최소 이동 횟수를 구하면 됩니다.

코드

import math

for x in range(int(input())):
    a, b = input().split()
    n = int(b)-int(a)
    
    ms = int(math.sqrt(n))

    d = n-ms
    for i in range(1, ms):
        d -= i*2

    rd = 0
    try:
        rd = d//ms + (1 if d%ms>0 else 0)
    except ZeroDivisionError:
        rd = d
    print(2*ms-1+rd)

설명

최대 이동량 k 기준으로 거리 구간이 나뉘는 성질을 이용합니다.

  • k^2를 기준으로 구간을 잡고
  • 남은 거리에 따라 이동 횟수를 보정합니다.

코드는 sqrt(distance)를 기반으로 기본 횟수를 만든 뒤 잔여 거리(rd)를 더해 최소 횟수를 계산합니다.



댓글남기기