계속해서 Leetcode의 two pointers과 관련된 문제들을 풀고 있다. k만큼 배열을 뒤집는 (reverse) 문제이다.
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]
문제를 보자마자 k
만큼 pop()
, unshift()
를 반복하는 방법이 떠올랐지만, 속지.. 않았다 start
, end
포인터를 활용하여 k
만큼 reverse하는 나름 신박한 방법의 코드를 참고했다.
[1,2,3,4,5]
배열과k=2
라고 주어질 때
- 먼저 모든 배열을 뒤집는다.
[1,2,3,4,5] → [5,4,3,2,1]
- 배열의 첫 인덱스인
0
부터k-1
만큼 뒤집는다.
[5,4,3,2,1] → [4,5,3,2,1]
k
부터length-1
까지 뒤집는다
[4,5,3,2,1] → [4,5,1,2,3]
reverse 함수는 1~3번의 동작을 수행하는 함수이다. 포인터로 start와 end를 이동시키며 단순한 swap 작업을 수행한다. 제시된 문제에서 nums 배열 자체를 수정하도록 해서 따로 return문을 작성하지 않았다.
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
k = k % nums.length;
reverse(nums, 0, nums.length - 1)
reverse(nums, 0, k - 1)
reverse(nums, k, nums.length - 1)
};
var reverse = function(nums, start, end) {
while(start < end) {
let temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}