Skip to content

Magical elevator

1. Problem

해당 문제는 여기에서 확인하실 수 있습니다.

2. Problem solving process

문제에서 제시되었듯이 마법의 엘리베이터에는 특별한 버튼들이 있는데, 이 버튼들에는 -1, +1, -10, +10, -100, +100 등과 같이 절댓값이 10의 거듭제곱 형태인 정수들이 적혀 있습니다. 이 버튼을 누르면 현재 층 수에 버튼에 적힌 값을 더한 층으로 이동하게 됩니다.

그러나 엘리베이터가 위치한 층과 버튼의 값을 더한 결과가 0보다 작으면 엘리베이터는 움직이지 않으며, 버튼을 한 번 누를 때마다 마법의 돌 한 개를 사용해야 한다는 제한 사항이 있습니다. 민수는 마법의 돌을 아끼기 위해 항상 최소한의 버튼을 눌러 이동하려고 합니다.

이때 문제를 해결하기 위해서는 민수가 어떤 층에서 엘리베이터를 타고 0층으로 내려가는데 필요한 마법의 돌의 최소 개수를 구해야 합니다.

우선, 주어진 층수(storey)를 0층으로 만들기 위해 각 자릿수를 개별적으로 처리하는 전략을 사용합니다. 이는 가장 작은 자릿수부터 시작하여 위로 올라가면서 진행됩니다.

핵심 아이디어는 각 자릿수에서 위로 올림할지 아래로 내림할지를 결정하는 것입니다. 일반적으로 자릿수의 값이 5보다 크면 위로 올림하고, 5보다 작으면 아래로 내림하는 것이 효율적입니다. 그러나 값이 정확히 5일 때는 다음 자릿수를 고려해야 합니다. 다음 자릿수가 5 이상이면 위로 올림하는 것이 더 효율적일 수 있습니다.

이러한 결정을 통해 각 자릿수를 처리할 때마다 사용된 마법의 돌의 개수를 계산하고 누적합니다. 위로 올림할 경우 (10 - 현재 자릿수 값)만큼의 돌을 사용하고, 아래로 내림할 경우 현재 자릿수 값만큼의 돌을 사용합니다.

이 과정을 모든 자릿수에 대해 반복하면서 storey를 0으로 만들어갑니다.

최종적으로 누적된 마법의 돌의 개수가 0층으로 가기 위해 필요한 최소한의 마법의 돌 개수가 됩니다.

3. Answer

def solution(storey):
  answer = 0

  while storey > 0:
    # 현재 자릿수의 값 계산
    remainder = storey % 10

    # 현재 자릿수가 5보다 크거나, 5이면서 다음 자릿수가 5 이상인 경우
    if remainder > 5 or (remainder == 5 and (storey // 10) % 10 >= 5):
      # 위로 올림
      answer += (10 - remainder)
      storey += (10 - remainder)
    else:
      # 아래로 내림
      answer += remainder

    # 다음 자릿수로 이동
    storey //= 10

  return answer