RotateArray

Published at 2021-11-09

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        length = len(nums)

        if length < k:
            k = k % length

        cutIdx = length - k  # 잘라야 하는 기준 인덱스

        nums[:] = nums[cutIdx:] + nums[:cutIdx]

        # k번 만큼 맨뒤꺼를 맨 앞으로 옮기는건 만약 k가 3이라면 뒤에서 3개만큼을 앞으로 옮기면 됨
        # k가 len보다 클 때만 처리해주면 끝
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    const reverse = (left, right, arr) => {
        while (left < right){
            const temp = arr[left];
            arr[left] = arr[right]
            arr[right] = temp
            
            left ++;
            right --;
        }
    }
    
    if(k>nums.length) k = k % nums.length;  // k가 길이보다 더 길경우 처리
    
    reverse(0, nums.length-1, nums);  // 1. 전체 뒤집기
    reverse(0, k-1, nums);  // 2. 0 ~ k 뒤집
    reverse(k, nums.length-1, nums);  // 3. k ~ 끝 뒤집
    
};


/*
[two pointer]
*파이썬으로 풀때는 k만큼만 잘라서 앞에 붙이는 방법 사용
이번 방식은 투포인터로 품
*/