Python_알고리즘
[Python] 백준 1011 Fly me to the Alpha Centauri
hahihuree
2021. 7. 6. 03:34
문제 바로가기
문제분석
# 이동을 앞뒤로 한칸씩 밖에 못한다.
# 시작과 도착 직전에는 한칸밖에 못움직인다.
# 최소한의 작동횟수로 이동해야하므로 1씩 커지다가 대칭으로 1씩 줄어들게 움직인다.
# 총 n번의 횟수로 갔다고 가정할 때, n-1번째 이동한 거리는 최대 2광년, n-2번째에 이동한 거리는 최대 3광년, n-3번째에 이동한 거리는 최대 4광년......
# 이런식으로 규칙을 찾아야 한다.
거리 | 최단루트 | 최소이동횟수 |
1 | 1 | 1 |
2 | 11 | 2 |
3 | 111 | 3 |
4 (2의 제곱) | 121 | 3 (2*2-1) |
5 | 1211 | 4 |
6 | 1221 | 4 |
7 | 12211 | 5 |
8 | 12221 | 5 |
9 (3의 제곱) | 12321 | 5(3*2-1) |
10 | 123211 | 6 |
11 | 123221 | 6 |
12 | 123321 | 6 |
13 | 1233211 | 7 |
14 | 1233221 | 7 |
15 | 1233321 | 7 |
16 (4의 제곱) | 1234321 | 7(4*2-1) |
# 거리가 어떤 수의 제곱이 나왔을 때, 최소이동 횟수는 해당 수의 제곱근에 2를 곱하고 -1을 한 값이다.
문제풀이
import math
case_number = int(input())
count = 0
result = []
for i in range(case_number):
a, b = map(int, input().split())
distance = b - a
square_root = math.floor(math.sqrt(distance))
squared = square_root ** 2
if distance <= 3:
count = distance
elif distance == squared:
count = (square_root * 2) - 1
elif squared < distance <= square_root + squared:
count = (square_root * 2)
elif square_root + squared < distance:
count = (square_root * 2) + 1
result.append(count)
for k in result:
print(k)
# 테스트 케이스를 입력값으로 받고, 이동횟수를 셀 변수와 결과값을 담을 리스트를 초기화한다.
# 테스트 케이스 수만큼 반복문을 돌린다.
# 먼저 입력된 값들간의 거리를 구하고, 그 거리의 제곱근을 구한다. (math모듈의 foor함수를 통해 정수만 구한다.)
# 그렇게 나온 제곱근의 제곱수를 다시 변수에 넣고 조건문의 비교연산에 쓴다.
# 조건문으로 거리가 3 이하일때는 거리와 카운트가 같으니 예외처리를 하고,
# elif문으로 제곱수와 거리를 비교해 count를 추가한다.