알고리즘 공부
[leetcode - 189. Rotate Array] java
철매존
2025. 1. 27. 00:19
728x90
반응형
문제 설명
1. 배열이 주어진다.
2. k 만큼 오른쪽으로 이동 + 배열 크기 넘어가면 처음으로 돌아오게 처리한다.
풀이 과정 - 1
1. 결과를 저장하는 배열을 만들어서 옮겨주면 된다.
2. k번 움직일 필요 없이 최종 결과로 가면 된다.
코드
class Solution {
public void rotate(int[] nums, int k) {
// 저장용
int save[] = new int[nums.length];
k %= nums.length; // k 숫자가 크면 배열만큼 이동하도록(어차피 배열 이상 가면 돌아옴)
for(int i=0; i<nums.length; i++) {
int index = i - k; // 이동한 위치
if (index < 0) index += nums.length;
save[i] = nums[index];
}
for(int i=0; i<nums.length; i++) nums[i] = save[i]; // 저장 처리
}
}
요렇게 했는데... 어째 성능이 낮게 나왔다.
그래서 빠른 풀이를 봤는데 와 미쳤다 소리가 나왔다.
풀이 과정 - 2
1. 배열을 하나 새로 만들어서 저장하면 공간복잡도와 시간복잡도에서 손해를 보게 된다.
2. 배열을 한번 싹 뒤집는다.
3. 그리고 k번 전까지 한번 뒤집는다.
4. k번부터 맨 뒤까지 한번 뒤집는다.
5. 이렇게 하면 특정 위치로 이동한거로 처리가 가능하다.
코드
class Solution {
public void rotate(int[] nums, int k) {
// Ensure that k is within the array's length
k = k % nums.length;
// Reverse the entire array
reverse(nums, 0, nums.length - 1);
// Reverse the first k elements
reverse(nums, 0, k - 1);
// Reverse the remaining elements
reverse(nums, k, nums.length - 1);
}
// Helper method to reverse a portion of the array
private void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}
솔직히 근데 이렇게 못풀어같음
반응형