풀이

📖 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배열을 다시 리턴해주면 됐다.


📖 추가로 생각난 풀이 방식

근데 막상 구현하고 보니 그냥 가운데 똑 잘라서 순서를 바꾸어 다시 붙이면 될것같은 느낌이 들었다.