STUDY/Algorithm

[백준] 1011 Fly me to the Alpha Centauri

sinawi95 2021. 2. 7. 18:17
728x90

www.acmicpc.net/problem/1011

 

1011번: Fly me to the Alpha Centauri

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

www.acmicpc.net

import sys
from math import sqrt
input = sys.stdin.readline
t=int(input())

for tc in range(t):
    x,y=map(int,input().split())
    distance = y-x
    n=int(sqrt(distance))

    if (n**2) == distance:
        print(2*n - 1)
    elif distance <= (n**2 +n):
        print(2*n)
    else: # distance <= (n**2 + 2*n):
        print(2*n + 1)

오랜만에 수학문제를 푸는것 같아서 기분이 좋았다. 

실제로 연습장을 펼치고 수식을 만들어보았다.

첫번째로는 x와 y상의 거리(distance)에 대해서 최소값이 몇번이 나오는지 일일이 구해봤다.

거리가 제곱수인 부분부터 새로운 값이 나타나기 시작했다. 즉 거리가 n의 제곱이면 최대 이동거리가 n이 된다.

distance 최소값 distance 최소값 distance 최소값 distance 최소값
1 1 2 1, 1 3 1,1,1 4 1,2,1
5 1,2,1,1 6 1,2,2,1 7 1,2,2,1,1 8 1,2,2,2,1
9 1,2,3,2,1 10 1,2,3,2,1,1 11 1,2,3,2,2,1 12 1,2,3,3,2,1
13 1,2,3,3,2,1,1 14 1,2,3,3,2,2,1 15 1,2,3,3,3,2,1 16 1,2,3,4,3,2,1

위의 표를 보면 조금 더 쉽게 이해할수 있고, 이를 사용하면 distance가 n^2일때 움직인 최소 횟수는 2*n-1이 되는것을 알 수 있다.

그 다음은 제곱수 사이에 있는 수들을 찾아야했다. 

위에서 '즉 거리가 n의 제곱이면 최대 이동거리가 n이 된다.'는 말을 했는데, 이 말은  n^2 에서부터 (n+1)^2 이전까지의 수들은 모두 최대 이동거리가 n이 된다는 뜻이다.

최대 이동거리를 지켜가며 각 거리를 더하면 최소 횟수가 나오게 된다.

distance 최소값 distance 최소값 distance 최소값 distance 최소값
5 1,2,1,1 6 1,2,2,1 7 1,2,2,1,1 8 1,2,2,2,1

보면 1부터 2n까지 더한 수들로 이루어 지는데 n^2 + 1~n 까지는 횟수가 한번 추가되고, n+1~2n 까지는 두번 추가된다. 

이를 코드로 나타내었고 통과하였다.


 

이문제는 실버 1이어서 어려울줄 알았는데 기본 수학 파트여서 그런지 다른 알고리즘보다 쉬운문제였다. 

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 2578 빙고  (0) 2021.02.10
[백준] 2615 오목  (0) 2021.02.09
[백준] 2839 설탕배달  (0) 2021.02.07
[백준] 2775 부녀회장이 될테야  (0) 2021.02.07
[백준] 1193 분수찾기  (0) 2021.02.07