[JAVA] 189. Rotate Array 풀이
풀이
📖 JAVA
Given an integer array nums, rotate the array to the right by k steps, where k is non-negative.
int[] 정수 배열이 주어지는데, 배열을 K번 오른쪽으로 밀어라, k는 음수는 아니다.
1, 2, 3, 4 ->
4, 1, 2, 3 ->
3, 4, 1, 2 ->
2, 3, 4, 1 ->
1, 2, 3, 4
요런식으로 돌리라는 말인듯?
Could you do it in-place with O(1) extra space?
혹시.. 너 메모리 공간을 좀 더 써서 결과가 단숨에 나오게 코드짜보지 않을래?
📖 풀이
public int[] rotate(int[] nums, int k) {
int[] result = nums.clone();
int index =0;
for (int n:result) {
while(index+k >= nums.length){
index -= nums.length;
}
nums[index+k] = n;
index++;
}
return nums;
}
문제 풀때 고민했던것
📖 깊은 복사와 얕은 복사
클래스에 input이 들어오면 output을 낸다는 생각에 당연히 새로운 정수배열로 결과를 리턴했다.
하지만 이미 주어진 배열을 값을 shift 시켜 재배열하는 것이 문제였는데
이미 나온 int[] result를 그냥 int[] nums 에
nums = result;
하니까 정답으로 말 안해주더라..
분명 둘다 로그 찍어보면 정답과 동일하게 나왔기 때문에 영문을 모르겠어서 진짜 뚫어져라 봤다.
홈페이지 문제인가 싶어 인터넷에 있는 아무 풀이나 갔다 붙였는데 놀랍게도 Accepted 떠서
내 코드가 잘못됐다는 것을 직시할수 있었다.
그래서 주어진 배열을 깊은 복사로 하나를 카피뜨고 기존의 nums 안의 값을 정리해서 result 배열로 넘기는것을
카피뜬 result 안의 값을 nums에 붙여넣는 식으로 변경하니 잘됐다.
📖 함수에 리턴값이 없는데 테스트하는 상황
주어진 solution 함수에 return 타입이 없었다.
나는 Junit의 Test를 이용하여 자체적으로 정답을 테스팅하고있는데
Junit에서 assert로 값을 검증하려면 일단 값이 있어야했다.
근데 return이 void 인 상황이다.
어쩌지 하다가 고민은 쉽게 해결됐는데
결국 내부에 있는 int[] nums를 검증하는 것이니 return할때 그냥 input으로 받은 nums배열을 다시 리턴해주면 됐다.
📖 추가로 생각난 풀이 방식
근데 막상 구현하고 보니 그냥 가운데 똑 잘라서 순서를 바꾸어 다시 붙이면 될것같은 느낌이 들었다.