Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 자릿수 왼쪽 회전을 통해 얻을 수 있는 최댓값 구하기

문제 소개

양의 정수 n을 입력받아, 숫자의 자릿수를 왼쪽으로 회전시켜 얻을 수 있는 모든 수 중에서 가장 큰 값을 반환하는 JavaScript 함수를 작성해야 합니다.

예를 들어 56789가 주어졌다면, 자릿수를 왼쪽으로 한 칸씩 밀어 만들 수 있는 수는 다음과 같습니다.

  • 1회 회전 → 67895
  • 2회 회전 → 78956
  • 3회 회전 → 89567
  • 4회 회전 → 95678

이 중 가장 큰 값은 95678입니다.

풀이 접근 방법

숫자를 문자열로 변환한 뒤 각 자릿수를 배열 요소로 분리하고, 배열을 회전할 때마다 새로운 숫자를 만들어 기존 최댓값과 비교하는 방식이 가장 직관적입니다. 자릿수가 d개인 숫자의 가능한 회전은 d−1가지이므로 시간 복잡도는 O(d²)이며, 실용적인 입력 범위에서는 충분히 효율적입니다.

예제 코드

const num = 56789;
const findMaximum = (num = 1) => {
   const digits = num.toString().split('');
   const totalDigits = digits.length;
   let largest = num;
   for(let i = 1; i < totalDigits; i++){
      // 왼쪽으로 i칸 회전한 숫자 생성
      const rotated = Number(
         digits.slice(i).concat(digits.slice(0, i)).join('')
      );
      if(rotated > largest){
         largest = rotated;
      }
   }
   return largest;
};
console.log(findMaximum(num));

출력 결과

95678

코드 동작 원리

  1. 자릿수 분리: toString()으로 숫자를 문자열로 바꾼 후 split('')을 사용해 각 자릿수를 배열 요소로 만듭니다.
  2. 회전 생성: slice(i)와 concat()을 조합하면 앞부분 i개의 자릿수가 뒤로 이동한, 즉 왼쪽으로 i칸 회전한 배열을 손쉽게 만들 수 있습니다.
  3. 최댓값 비교: 회전된 배열을 join('')으로 다시 합치고 Number()로 변환한 뒤, 현재까지의 최댓값보다 크면 갱신합니다.
  4. 결과 반환: 모든 회전 경우를 확인한 후 최종 최댓값을 반환합니다.

이 방식은 원본 숫자 자체도 초기 최댓값으로 포함하므로, 회전 결과가 모두 원본보다 작은 경우에도 올바른 값을 반환합니다.