본문 바로가기

자료구조,알고리즘

LeetCode-189 Rotate Array 파이썬 문제 풀이

 

Rotate Array - LeetCode

Can you solve this real interview question? Rotate Array - Given an integer array nums, rotate the array to the right by k steps, where k is non-negative.   Example 1: Input: nums = [1,2,3,4,5,6,7], k = 3 Output: [5,6,7,1,2,3,4] Explanation: rotate 1 step

leetcode.com

 

문제

int형 배열 nums 안의 요소들을 k 만큼 오른쪽으로 회전 시키는 문제입니다. 예를들어 [ 1, 2, 3, 4 ] 배열을 두번 회전 하면 1,2가 순서대로 배열 뒤쪽으로 배치되어 [ 3, 4, 1, 2 ]가 되는 방식입니다.

풀이

가장 쉽게 생각해 볼수 있는건 뒤로 옮겨질 요소 수 만큼 그대로 잘라서 배열뒤쪽에 옮기는 방식입니다. 하지만 이 방법은 회전 수가 배열의 크기를 넘어가지 않을때만 가능하다는 단점이 있습니다. 예를 들어 [ 1, 2, 3, 4 ] 배열을 두번 회전시켰을 때는 배열의 크기가 회전수 보다 크기 때문에 [ 3, 4, 1, 2 ]가 되겠지만 [ 1, 2 ]를 5번 회전 시켰을 경우에는 outoffindex 에러를 마주치게 됩니다.

이 방법은 딱 한번만 실행하면 되기 때문에 속도도 빠른 편입니다. 따라서 배열의 크기보다 회전 수가 큰 경우만 고려하여 작성해 보겠습니다.

 

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        nums[:] = nums[len(nums)-k:]+nums[:len(nums)-k]

if문을 사용해서 회전 수가 배열의 크기보다 큰 경우만 걸러주겠습니다. 이때 회전수와 배열의 크기를 나누었을때 생기는 나머지가 회전 시 뒤로 옮겨지게된 요소 수와 똑같습니다. [ 1, 2 ]를 5번 회전시킬 경우 5를 2로 나누었을 때 생기는 나머지인 1만큼만 회전이 되는 방식입니다.

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        if k > len(nums):
            k = k % len(nums)
        nums[:] = nums[len(nums)-k:]+nums[:len(nums)-k]