본문 바로가기
백준 알고리즘(BOJ)

백준 알고리즘 1011 (Fly me to the Alpha Centauri) - python

by Think_why 2019. 10. 15.

[ 문제 ] 백준 알고리즘 1011 (Fly me to the Alpha Centauri) - python

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

 

1011번: Fly me to the Alpha Centauri

우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행사가 되어 새로운 세계에 발을 내려 놓는 영광의 순간을 기다리고 있다. 그가 탑승하게 될 우주선은 Alpha Centauri라는 새로운 인류의 보금자리를 개척하기 위한 대규모 생활 유지 시스템을 탑재하고 있기 때문에, 그 크기와 질량이 엄청난 이유로 최신기술력을

www.acmicpc.net

 

입력 x와 입력 y의 거리에 따른 규칙을 찾아 해결하는 문제이다.

규칙에 따라 표로 정리해보면, 아래와 같다.

 

거리  이동 횟수 횟수 증가 시점 수식
1 1 1    
2 11 2    
3 111 3 3 이하는 그대로 출력  
4 121 3 2의 제곱 2*2-1
5 1211 4    
6 1221 4 2의 제곱 + 2 2*2
7 12211 5    
8 12221 5    
9 12321 5 3의 제곱 2*3-1 (=2*2+1)
10 123211 6    
11 123221 6    
12 123321 6 3의 제곱 + 3 2*3
13 1233211 7    
... ... ... ... ...

 

내가 발견한 규칙은 (N>=2일 때) 

1. N의 제곱 또는 N의 제곱 + N의 거리 이후 횟수가 증가한다는 것

2. N의 제곱일 때는 2 * N - 1, N의 제곱 + N이하는 2 * N, 그 이후로는 2 * N + 1의 횟수를 갖는 것

 

이 규칙들을 이용하면, N과 거리의 관계만으로 코드를 구현할 수 있다.

 

[Code]

import math
T = int(input())
for _ in range(T):
    x, y = map(int, input().split())
    diff = int(y - x)
    if diff <= 3:
        print(diff)
    else:
        n = int(math.sqrt(diff))
        if diff == n ** 2:
            print(2*n-1)
        elif n ** 2 < diff <= n ** 2 + n:
            print(2*n)
        else:
            print(2*n+1)

 

728x90

댓글