미소를뿌리는감자의 코딩
[백준 2024/02/21] 1011번 Fly me to the Alpha Centauri - python ver. 본문
https://www.acmicpc.net/problem/1011
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))
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준 2024/02/22] 10814번 나이순 정렬 (0) | 2024.02.22 |
---|---|
[백준 2024/02/22] 2751번 수 정렬하기 2 (0) | 2024.02.22 |
[백준 2024/02/21] 14534번 String Permutation (0) | 2024.02.21 |
[백준 2024/02/21] 5939번 Race Results (0) | 2024.02.21 |
[백준 2024/02/20] 17779번 게리맨더링 2 (1) | 2024.02.20 |