알고리즘 & 코딩테스트

[백준] 1011번 Fly me to the Alpha Centauri

Haksae 2022. 3. 5. 04:06

⛏ 문제 파악

  • x지점부터 y지점까지 가는데 필요한 최소한의 이동 횟수를 구하는 문제
  • 단순한 이동이 아니라 조건이 있다.
    • 이전에 이동한 거리의 -1, 0, +1 을 하여 이동할 수 있다. (가속과 감속이 가능한 시스템)
    • 그리고 y지점에 도착하기 바로 직전의 이동거리는 1이어야한다. (도착 직전에는 1이어야한다.)
  • 이 조건대로 이동을 해보면 다음과 같다. 아래와 같이 기록하여 발견할 수 있는 법칙은 2가지이다.

👉🏻  답안

  • 위의 법칙으로 문제를 풀면 다음과 같다.
T = int(input())

for _ in range(T):
  x, y = map(int,input().split())
  distance = y - x     # 이동해야하는 거리
  count = 0            # 이동한 횟수
  movement = 1         # 최대 이동 가능 거리
  total_movement = 0   #총 이동 거리

  while total_movement < distance:  #총 이동거리가 이동해야하는 거리보다 작으면 while 반복
    count += 1
    total_movement += movement
    if count % 2 == 0:
      movement += 1
  print(count)

 

📑  간단한 설명

  • for _ in range(T)로 값을 받는 횟수를 지정해준다.
  • 출발지점을 x로, 도착 지점을 y로 받는다. y-x를 통해서 이동해야하는 거리를 구한다.
  • while 안에서 위의 법칙 1)과 2)를 구현한다.
    • 2)는 아래와 같이 구현
      • count +=1   // 카운트 증가
      • total_movement += movement  // 최대 이동 가능 거리 더하기 
    • 1)은 아래와 같이 구현
      • if count %2 == 0:      // 카우트가 2 증가하면
      • movement += 1        // 최대 이동거리가 1 증가한다.