문제 링크: https://leetcode.com/problems/rotate-array/description/
주어진 조건
문제
배열을 k번 오른쪽으로 회전하게 되면, 원래 배열 형태의 왼쪽과 오른쪽을 잘라 위치를 바꾸어 붙인 형태가 된다. (ex. [1, 2, 3, 4, 5, 6, 7]
3번 회전→ [5, 6, 7, 1, 2, 3, 4]
)
그렇다면, k를 nums의 길이로 나눈 나머지를 이용해 배열을 slicing 해서 붙이면 되지 않을까? 라는 생각으로 구현하게 되었다.
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
k = k % len(nums)
answer = []
left = nums[len(nums)-k:]
right = nums[:len(nums)-k]
answer = left + right
nums.clear()
nums.extend(answer)
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
k = k % len(nums)
nums[:] = nums[-k:] + nums[:-k]
이 풀이는 나의 코드에서 불필요한 메모리 할당을 줄였기 때문에, 속도와 메모리 측면에서 더 좋은 결과가 나왔다.
하지만 nums[:] = nums[-k:] + nums[:-k]
여기에서는 어쩔 수 없이 nums[-k:]
를 위한 임시 리스트와 nums[:-k]
를 위한 임시 리스트의 메모리 할당이 있기 때문에, 공간 복잡도는 여전히 O(1)을 달성하지 못했다.
코테는 속도가 더 중요하다고 생각하므로, 이 풀이가 좀 더 적합한 것 같다.