관리 메뉴

FU11M00N

[LeetCode] Rotate Array - Javascript 본문

알고리즘

[LeetCode] Rotate Array - Javascript

호IT 2023. 8. 24. 23:41

Rotate Array

[배열 순환]

제약 조건 

1 <= nums.length <= 10^5
-23^1 <= nums[i] <= 23^1 - 1
0 <= k <= 10^5

 

Example

ex1) Input: nums = [1,2,3,4,5,6,7], k = 3
     Output: [5,6,7,1,2,3,4]

ex2) Input: nums = [-1,-100,3,99], k = 2
     Output: [3,99,-1,-100]

초기 문제 접근 방식

먼저 반복문은 k의 값만큼 순회하고 splice를 사용해 기존의 배열은 유지한 채로,
k 값을 기준으로 해당 위치에 있는 값을 배열의 맨 앞으로 이동시킨다.
그 후 해당 인덱스는 배열에서 삭제하는 방법을 생각했다.

그럼 반복문 i가 0일 땐,
[1,2,3,4,5,6,7] -> [5,1,2,3,4,6,7]으로 변경되며
k를 1씩 감소하며 나머지 뒤에 있는 배열도 앞으로 옮기는 작업을 한 것이다.

초기 전체코드

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */

var rotate = function (nums, k) {
    let l = k
   for (let i = 0; i < l; i++) {
      nums.splice(i, 0, nums[nums.length - k]);
      nums.splice(nums.length - k, 1);
      k--;
   }
};

 

해당 코드로 주어진 아래의 testcase 2개를 통과하여 제출을 했다.

ex1) Input: nums = [1,2,3,4,5,6,7], k = 3
     Output: [5,6,7,1,2,3,4]

ex2) Input: nums = [-1,-100,3,99], k = 2
     Output: [3,99,-1,-100]

다시 생각 해보며..

하지만 전체의 38개의 testcase 중 27개밖에 통과를 하지 못했고, 해당 코드에 문제가 있음을 인지했다.

먼저 실패한 testcase는 아래와 같다.

ex3) Input: nums = [1,2], k= 3
     Output: [2,1]

그렇다.. nums 배열의 인덱스 개수보다 k가 클 경우가 존재하는거다.

내가 작성한 코드는 k는 nums의 배열보다 작을 경우를 생각 해 작성 한 코드이기에 다른 테스트 케이스를 통과하지 못한것이다.

solve 전체 코드

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function (nums, k) {
   let tmp = nums.splice(-(k % nums.length));
   nums = nums.splice(0, 0, ...tmp);
};

k가 nums.length 보다 클 경우도 고려하여 나머지 값을 사용했다.

nums.splice(-(k % nums.length));

k와 nums.length의 나머지 연산을 수행해 나머지 값만큼 배열을 잘라낸다.

만약 splice(-1)을 넣으면 배열의 뒤부터 1개를 잘라내는 의미이다.

nums = nums.splice(0, 0, ...tmp);

그 후 배열을 앞에서부터 이어붙이는 것이다.

다른 sovle 코드

var rotate = function(nums, k) {
    for(let i = 0; i < k; i++) {
        const pop = nums.pop();
        nums.unshift(pop);
    }
};

반복문을 k 만큼 순회하며 배열의 맨 뒤부터 pop을 하며
unshift를 사용해 앞에서부터 이어 붙이는 방법도 존재한다.

Comments