원형 다이얼 최소 이동 수

자바스크립트 코딩테스트 문제로 circular-distance 주제를 연습해보세요. 난이도는 easy이며, 브라우저에서 바로 JavaScript로 풀이를 실행할 수 있습니다.

today easy circular-distance 함수명: minimumCircularDialMoves 제한 시간: 200ms

두 숫자 문자열을 같은 길이의 원형 다이얼로 보고, 목표 숫자로 바꾸는 데 필요한 최소 이동 수를 구하는 문제입니다.

문제 설명

현재 다이얼 상태를 나타내는 문자열 current와 목표 상태를 나타내는 문자열 target이 주어집니다.

각 자리의 다이얼은 0부터 9까지 원형으로 이어져 있습니다. 즉, 9에서 한 칸 앞으로 가면 0, 0에서 한 칸 뒤로 가면 9가 됩니다.

각 자리는 서로 독립적으로 움직일 수 있습니다. 각 자리에서 시계 방향 또는 반시계 방향으로 움직일 수 있을 때, currenttarget으로 바꾸기 위한 최소 총 이동 수를 반환하는 minimumCircularDialMoves 함수를 작성하세요.

제한사항

  • currenttarget의 길이는 서로 같습니다.
  • 각 문자열의 길이는 1 이상 100,000 이하입니다.
  • 각 문자열은 숫자 문자 (0~9)로만 이루어집니다.
  • 한 번 움직일 때 한 자리의 숫자는 1만큼 변합니다.
  • 반환값은 필요한 최소 총 이동 수입니다.

예시

  • 입력: current = "039", target = "920" → 출력: 3
  • 입력: current = "5555", target = "5555" → 출력: 0
  • 입력: current = "9", target = "0" → 출력: 1
  • 입력: current = "000", target = "999" → 출력: 3

힌트

  • 각 자리는 다른 자리와 상관없이 최소 이동 수를 따로 계산할 수 있습니다.
  • 두 숫자의 차이를 diff라고 하면, 반대 방향으로 도는 비용은 10 - diff입니다.
  • 각 자리에서 Math.min(diff, 10 - diff)를 더해 보세요.

해설

핵심은 각 자리를 독립적으로 보고 더 짧은 회전 방향을 고르는 것입니다.

예를 들어 3에서 8로 가는 방법은 두 가지입니다.

  • 시계 방향으로 5칸 이동
  • 반시계 방향으로 5칸 이동

9에서 0으로 가는 경우는:

  • 시계 방향으로 1칸 이동
  • 반시계 방향으로 9칸 이동

따라서 각 자리마다 다음 과정을 반복하면 됩니다.

  1. current[i]target[i]를 숫자로 바꿉니다.
  2. 두 값의 차이의 절댓값을 diff로 구합니다.
  3. diff10 - diff 중 더 작은 값을 선택합니다.
  4. 그 값을 정답에 누적합니다.

current = "039", target = "920"이면:

  • 0 -> 9: 1칸
  • 3 -> 2: 1칸
  • 9 -> 0: 1칸
  • 총합은 3

다른 예시로 current = "109", target = "808"이면:

  • 1 -> 8: 최소 3칸
  • 0 -> 0: 0칸
  • 9 -> 8: 1칸
  • 총합은 4

이처럼 각 자리의 최소 회전 수를 모두 더하면 전체 최소 이동 수를 구할 수 있습니다.

이 방법은 문자열을 한 번만 순회하므로 시간 복잡도는 O(n)이고, 추가 공간은 O(1)입니다.

코드 작성

starter code를 바탕으로 함수를 완성한 뒤 예제 테스트를 실행해보세요.

JavaScript 에디터 로딩 중...

커스텀 테스트

함수 인자를 JSON 배열 형태로 입력하세요. 예: [3, 5], [[1, 2, 3]]

아직 실행하지 않았습니다.

실행 결과

아직 실행하지 않았습니다.

예제 테스트를 실행하면 여기에서 결과를 확인할 수 있습니다.

댓글

문제 풀이 아이디어, 질문, 반례를 자유롭게 나눠보세요.