미소를뿌리는감자의 코딩

[백준 2024/02/21] 1011번 Fly me to the Alpha Centauri - python ver. 본문

코딩 테스트/백준

[백준 2024/02/21] 1011번 Fly me to the Alpha Centauri - python ver.

미뿌감 2024. 2. 21. 21:08
728x90

https://www.acmicpc.net/problem/1011

 

1011번: Fly me to the Alpha Centauri

우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행

www.acmicpc.net

 

1. 접근 방법

이전에 Java로 문제를 처음 풀었을 때에는, 규칙을 찾는 것인지 몰라 많이 헤맸었다.

하지만, 이번에는 규칙을 찾는 것임을 알고 있었기에 비교적 쉽게 풀 수 있었다.

 

우선 거리에 따른 횟수를 노트에 적어가며 규칙을 찾도록 했다.

이런식으로 적어주었다. 이후 동그라미를 친 숫자들을 보면, 제곱수를 대상으로 위아래로 루트(제곱수) 만큼 숫자가 1 다름을 확인할 수 있다.

우선 distance에 루트를 씌운 값이 3인 것을 예로 들어보자.

9에서부터 15까지가 3 또는 3.xx인 값임을 확인할 수 있다.

 

이때, 9 + 3 (루트 9(소수점 버림)) <= d 인 값이 6의 값을 가지고,

        9 + 3 (루트 9(소수점 버림)) > d 인 값이 7의 값을 가짐을 확인할 수 있다.

 

즉, (루트 9(소수점 버림)) * 2 //// 3*2 = 6 의 값을 가지며

      (루트 9(소수점 버림) * 2 + 1 ///// 3*2 + 1 = 7의 값을 가짐을 확인할 수 있다.

 

또한 거리가 9인 값의 경우 5의 값, (루트 9(소수점 버림))*2 -1 의 값을 가짐을 확인할 수 있다.

거리가 9, 즉 제곱수 임을 확인하기 위해서는 (루트를 씌운 값) - (루트를 씌우고 소수점 버림을 해준 값) 이 0 인지 확인해 주었다.

 

이를 if elif else 문으로 구성하여 문제를 해결해 주었다.

 

처음 이 문제를 접했을 때에는 어려웠지만, 다시 접해보니 빠르게 푸는 나를 보며 조금..뿌듯..하다 ㅎㅎ

 

2. 코드

import math

def fly_me(d):
    d_sqrt = math.sqrt(d)
    d_floor = math.floor(d_sqrt)

    if d_sqrt - d_floor == 0:
        return d_floor * 2 - 1

    elif d_floor**2 + d_floor >= d:
        return d_floor * 2
    else:
        return d_floor * 2 + 1


for i in range(int(input())):
    x, y = map(int, input().split())
    d = y - x
    print(fly_me(d))
728x90