[백준-파이썬] 1011번 Fly me to the Alpha Centauri : 규칙 찾기

Chanyoung Lee·2021년 6월 5일
0

백준

목록 보기
1/6

문제

1011번 바로보기
순간이동은 언제쯤 가능할까. 최신기술력을 동원한 공간이동 장치여도 제한이 많다. 목표 행성으로 처음 출발할 때 1광년을 이동하고, 그 다음 이동할 때 0,1,2 광년을 이동할 수 있다고 한다. 즉, 한번에 수십광년을 뛰어넘을 수 없다는 말이다. 근데 가장 재밌는 것은 행성에 도착하기 직전에는 반드시 1광년만 이동해야 한다.

결국, 1광년으로 출발하면 도착할 때도 반드시 1광년이어야 하고. 이동 거리마다 1광년 내외로 거리를 늘이거나 줄이면서 접근해야 한다.

고민

처음 파이썬을 배울 때 주먹구구식 풀이보다 순서도 등을 활용한 문제 접근을 잘 하라고 조언 받았다. 문제 접근 방식에 따라 문제 풀이가 굉장히 단순해질 수 있는 일이다.

근데 유독 이 문제는 나의 현재 레벨에서 순서도가 잘 그려지지 않았다.
'처음과 마지막은 무조건 1씩, 전체 거리에서 2를 빼고 시작할까?' 등 고민을 거듭한 끝에 약간의 노가다를 시도하기로 했다.

여기서 거리는 광년 기준 거리이고,
식은 공간 이동을 거리별로 나타냈기 때문에 작동 횟수로 볼 수 있다.

즉, 식이 한 칸 길어진다는 것은 공간이동 장치를 한번 더 사용했다고 볼 수 있다.
식의 개수 = 공간이동 장치 작동 횟수

같은 식의 개수 내 최대 이동 거리 사이(이미지의 초록색 음영 부분)의 규칙을 찾아보니 거리가 1씩 두번 늘어나고, 2씩 2번 늘어나고, 3씩 두번 늘어나고, 4씩 두번 늘어나는 규칙을 찾아내었다.

(노가다로 찾아 부끄럽지만 내 수준을 남기기 위해..ㅠ)

순서도를 작성해 정리하고 아래와 같이 코드를 짜보았다.

해결

from sys import stdin

T=int(stdin.readline().strip()) #테스트 케이스 개수 받기

for i in range(T): #테스트 케이스 만큼 계산해주기
    x, y = stdin.readline().split() #시작과 도착 거리 받기

    distance=int(y)-int(x) #거리 구하기

    space=0 #공간이동 장치 작동 횟수
    k=0 #space 중 어디에 속하는지 알기 위한 최대 거리
    a=0.5 #거리가 두 번에 걸쳐 1씩 늘어나기 때문

    while distance > k: #거리가 최대거리보다 작아지는 순간의 space를 구하기 위함
        a=a+0.5
        k=k+int(a)
        space=space+1

    print(space)

리뷰

  1. 노가다로 규칙을 찾고 그것을 코드화 하는 과정에서 남들이 읽기 쉬운 코드는 아닌 듯.
  2. 처음 볼 때는 고민해도 방법을 찾지 못했는데, 3주 뒤에는 문제를 풀게 되었다. 잘 안풀리는 경우 다른 관점과 환경에서 접근해보기.
profile
함께 일하는 가치를 아는 사람

0개의 댓글