Codility Lesson 2 - CyclicRotation

문제 설명

N개의 정수로 구성된 배열 A가 주어집니다. 배열의 회전은 각 요소가 하나의 인덱스만큼 오른쪽으로 이동하고 배열의 마지막 요소가 첫 번째 위치로 이동하는 것을 의미합니다. 예를 들어 배열 A = [3, 8, 9, 7, 6]의 회전은 [6, 3, 8, 9, 7]입니다(요소가 인덱스 하나씩 오른쪽으로 이동하고 6이 첫 번째 위치로 이동).

목표는 배열 A를 K회 회전하는 것입니다. 즉, A의 각 요소를 오른쪽으로 K회 이동하는 것입니다.

함수를 작성합니다:

function solution(A, K);

이 함수는 N개의 정수로 구성된 배열 A와 정수 K가 주어지면 배열 A를 K번 회전한 값을 반환합니다.

예를 들어

A = [3, 8, 9, 7, 6]
K = 3

이면 함수는 [9, 7, 6, 3, 8]을 반환해야 합니다. 세 번의 회전이 이루어졌습니다:

[3, 8, 9, 7, 6] -> [6, 3, 8, 9, 7]
[6, 3, 8, 9, 7] -> [7, 6, 3, 8, 9]
[7, 6, 3, 8, 9] -> [9, 7, 6, 3, 8]

다른 예로, 주어진

A = [0, 0, 0]
K = 1

이면 함수는 [0, 0, 0]을 반환해야 합니다.

주어진

A = [1, 2, 3, 4]
K = 4

인 경우 함수는 [1, 2, 3, 4]를 반환해야 합니다.

가정합니다:

N과 K는 [0..100] 범위 내의 정수입니다; 배열 A의 각 요소는 [-1,000..1,000] 범위 내의 정수입니다. 솔루션에서 정확성에 중점을 둡니다. 솔루션의 성능은 평가의 초점이 아닙니다.

문제 접근

모든 배열을 반복 할 필요없이 배열의 길이로 K 로 나눈 나머지가 실제로 움직이는 횟수이다.

  1. 숫자 K 를 배열의 길이로 나눈 나머지를 구한다.
  2. 나머지 숫자를 배열의 끝에서부터 자른다.
  3. 이전에 자른 배열과 배열에 시작 부터 나머지 전까지의 값을 이어 붙인다.
function solution(A, K) {
  const num = K % A.length

  if (num === 0) {
    return A
  }

  const result = A.slice(-num)

  return result.concat(A.slice(0, A.length - num))
}