https://leetcode.com/problems/rotate-array
🧐 나머지 연산을 이용하자
➡️ 현재 인덱스가 이동해야할 인덱스를 (현재 인덱스 + K) % 배열 길이로 계산할 수 있다
복사한 배열 = 주어진 배열
for(인덱스 = 0 to 주어진 배열의 길이){
원래값 = 복사한 배열[인덱스]
이동할 인덱스 = (인덱스 + k) % 주어진 배열의 길이
주어진 배열[이동할 인덱스] = 원래값
}
public static void reverse(int[] nums,int start,int end){
while(end>start){
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
public void rotate(int[] nums, int k) {
k%= nums.length;
reverse(nums,0,nums.length-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.length-1);
}
구간 내 절대적인 순서가 바뀌지 않는다는 점을 이용했다.
(k+1:nums.length-1) 과 (0:k) 두 구간으로 나눠 세번 뒤집었다.
나의 풀이는 추가 공간을 요구하는데, 이 풀이는 추가 배열 공간이 필요 없다.
또한 시간복잡도도 O(N)으로 동일하다.
ex>
(1)0 1 2 3 4 5 6
(2)6 5 4 3 2 1 0
(3)4 5 6 3 2 1 0
(4)4 5 6 0 1 2 3