[분석] Codility - CyclicRotation - Javascript

1 minute read

Codility 연습문제 > CyclicRotation > Javascript
주어진 단계 수만큼 배열을 오른쪽으로 회전하며 K번째 회전된 배열을 반환하는 문제.

실제 문제의 저작권은 Codility 에 있으므로 전체 문제의 내용은 Codility 페이지를 방문해 확인하세요.

[문제 및 조건]

N개의 정수로 구성된 배열 A가 주어집니다. 배열의 요수 하나의 index 만큼 오른쪽으로 이동하고 배열의 마지막 요소는 맨 앞으로 이동합니다. 배열은 K라는 숫자만큼 회전을 하게되며 마지막 정렬된 배열을 반환하는 문제입니다.

  1. 1회전시 배열내 각 요소는 한칸씩 뒤로 이동, 맨 마지막 요소는 맨 앞으로 이동하면 순환한다.
  2. K 숫자는 이동 숫자를 의미한다.
  3. K 만큼 이동했을경우, 최종 배열의 값을 반환해야한다.

[분석]

  1. A 라는 배열과, K 라는 정수 숫자 값이 인자로 사용됩니다.
  2. 배열의 길이는 0 ~ 100 이고, 각 요소의 숫자는 -1,000 ~ 1,000 범위입니다.
  3. [0, 0, 0] 이나 [-1, 0, 0] 등의 다양한 숫자가 올 수 있습니다.
  4. 예를들어, A = [3, 8, 9, 7, 6] K = 3 이면 [9, 7, 6, 3, 8]을 반환합니다.



[풀이]

  1. 배열의 요소를 한칸씩 오른쪽으로 이동시킵니다.
  2. 맨 마지막 숫자는 더이상 이동이 안되므로 맨 앞으로 이동시켜 순환 시킵니다.
  3. 문제는 성능을 평가하지 않으므로 풀이에 초첨을 두며 기술합니다.
function solution(A, K) {
  // K 횟수를 A의 길이로 나눈 나머지를 구합니다. 나머지가 결국 최종 움직인 횟수가 됩니다.
  const moveNum = K % A.length; 

  // moveNum 이 0이라면 원래 A의 배열과 동일함을 의미합니다.
  if (moveNum) {
    // 저는 최종 움직인 거리의 index 번호 기준값을 이용해 잘라내는 방법을 이용했습니다.
    // 즉 뒤에서 움직인 거리만큼의 개수를 잘라냅니다.
    const newArray = A.splice(A.length - moveNum);

    // 움직여서 앞으로 이동했을 배열과 잘라내고 남아있는 A 배열을 다시 합쳐 반환합니다.
    return [...newArray, ...A];
  }

  return A;
}



[마치며]

CyclicRotation 연습문제는 K의 모든 수를 전부 순환할 필요가 없는 게 핵심인 것 같습니다. 총개수를 이용해 나머지만 구하면 그 나머지 값이 한 바퀴 순환 후 최종 움직여야 할 거리가 되기 때문입니다. 성능에 대한 평가 문제는 아니지만 여유가 된다면 최적화가 필요해 보입니다.

Tags:

Categories:

Updated:

 

 

Leave a comment