[LeetCode] Rotate Array

Hyebin·2021년 3월 14일
0
post-thumbnail

문제

Given an array, rotate the array to the right by k steps, where k is non-negative.

Follow up:

Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Could you do it in-place with O(1) extra space?

배열의 오른쪽으로 k 단계 씩 회전 합니다. (k는 음수가 아닙니다.)

문제를 해결하는 방법이 적어도 3가지 있으니 여러가지 방벅으로 풀어보라고 한다. ^^;;

- Example :

Input: nums = [1,2,3,4,5,6,7], k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]

- 제출 코드 :

배열의 메소드를 가지고 풀어봤다.
1. nums 배열의 전체 진행을 위해 k 만큼 반복 루프를 돌린다.
1. 마지막 값을 첫번째 index에 추가해준다.
2. 마지막 index를 삭제해준다.

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    //배열 끝에서 부터 k만큼의 인덱스를 배열 첫번째로 넣는다.

    //k만큼 배열의 끝번째 값을 첫번째에 넣는다. 
    for(let i=1; i<=k; i++) {
        nums.unshift(nums[nums.length-1]);
        nums.pop();
    }  
    //return nums;
};

- 실행 속도 비교:

위 식으로 진행하면 runtime도 길게 나오고 메모리도 좀 많이 잡아 먹는걸 확인할 수 있다.

- 개선 코드 :

배열의 끝에서 k 만큼 통으로 잘라서 ...로 문자열화 시켜주고 배열 앞에 넣어줬다.
이렇게 해주니 반복루프 돌면서 배열의 끝 값을 하나씩 앞에 추가하고, 끝값을 삭제해줬던 식보다 속도가 확실히 빨라졌다.

var rotate = function(nums, k) {
    nums.unshift(...(nums.splice(nums.length-k, k)))
};

0개의 댓글