오늘도 개발

28. Rotate Array 본문

자료구조 & 알고리즘/Leetcode

28. Rotate Array

Sueeeeeee 2022. 10. 17. 11:37

문제

배열 nums의 요소를 k만큼 이동하라.

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

 

내가 생각한 방식

전체 배열을 뒤집고, k를 기준으로 앞, 뒤를 다시 정렬.

문제점 : nums가 [1, 2]고 k가 3일때 두번째 while에서 list index out of range 오류 발생

def rotate(nums, k):
    # 전체 배열을 뒤집음 [7, 6, 5, 4, 3, 2, 1]
    i = 0
    j = len(nums) - 1

    if (i == j or k == 0):
        return nums

    while (i < j):
        nums[i], nums[j] = nums[j], nums[i]
        i += 1
        j -= 1

    # 뒤집은 배열의 앞쪽 정렬 
    i = 0 
    j = k - 1
    while (i < j):
        nums[i], nums[j] = nums[j], nums[i]
        i += 1
        j -= 1

    # 뒤집은 배열의 뒷쪽 정렬
    i = k 
    j = len(nums) - 1
    while (i < j):
        nums[i], nums[j] = nums[j], nums[i]
        i += 1
        j -= 1
    return nums

 

해결 방식

https://leetcode.com/problems/rotate-array/discuss/1730142/JavaC%2B%2BPython-A-very-very-well-detailed-explanation

k에 모듈러 적용.

k를 기준으로 앞, 뒤를 정렬하고 전체 배열을 뒤집음.

내가 생각한 방식대로 뒤집고 앞, 뒤를 정렬하면 바르게 정렬되지 않음.

class Solution:
    def reverse (self, nums, i, j) : 
        while i < j:
            nums[i], nums[j] = nums[j], nums[i]
            i += 1
            j -= 1
            
    def rotate(self, nums: List[int], k: int) -> None:
        k = k % len(nums)
        if k < 0 : 
            k += len(nums)
        
        self.reverse(nums, 0, len(nums) - k - 1);
        self.reverse(nums, len(nums) - k, len(nums) - 1);
        self.reverse(nums, 0, len(nums) - 1);

 

 

'자료구조 & 알고리즘 > Leetcode' 카테고리의 다른 글

31. Linked List Cycle  (0) 2022.10.20
30. Design Linked List  (0) 2022.10.19
27. Minimum Size Subarray Sum  (0) 2022.10.15
26. Two Sum II - Input array is sorted  (1) 2022.10.15
25. Array Partition I  (1) 2022.10.14