자바 알고리즘

[leetcode - Java] 189. Rotate Array

Big Iron 2023. 8. 24. 23:38

1. 문제


  • nums 배열에서 입력받은 k 만큼 요소들 오른쪽으로 이동시키기image

2. 시도


첫 번째
리스트를 새로 생성하고 추가/삭제하는 로직이 중간에 있어 속도 부분에서 효율이 좋지 않을 수 있다. 별 다른 방법이 생각나지 않아 우선 코드가 잘 작동하는지 테스트를 해보았음

class Solution {
    public void rotate(int[] nums, int k) {
        int end = nums.length-1;
        List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());
        List<Integer> kLists = new ArrayList<>();

        System.out.println("list = " + list);

        for (int i=0; i<k; i++) {
            kLists.add(list.get(end-i));
            list.remove(end-i);
        }
        System.out.println("result1 = " + list);
        System.out.println("result2 = " + kLists);

        for (int i=0; i< kLists.size(); i++) {
            list.add(0,kLists.get(i));
        }

        System.out.println("result3 = " + list);
        for (int i=0; i<nums.length; i++) {
            nums[i] = list.get(i);
        }
    }
}
image

image

테스트코드 일부 성공으로 방향성은 맞아 보이지만 k가 배열 길이보다 클 떄를 고려해야할 것 같다.


두 번째
k를 배열 길이로 나눈 나머지 값으로 설정해 보았다.

class Solution {
    public void rotate(int[] nums, int k) {
        k = k % nums.length;
        int end = nums.length-1;
        List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());
        List<Integer> kLists = new ArrayList<>();

        System.out.println("list = " + list);

        for (int i=0; i<k; i++) {
            kLists.add(list.get(end-i));
            list.remove(end-i);
        }
        System.out.println("result1 = " + list);
        System.out.println("result2 = " + kLists);

        for (int i=0; i< kLists.size(); i++) {
            list.add(0,kLists.get(i));
        }

        System.out.println("result3 = " + list);
        for (int i=0; i<nums.length; i++) {
            nums[i] = list.get(i);
        }
    }
}
image

예상대로 시간은 더 걸린듯하지만 코드는 성공이다. 추후 개선 사항으로는 리스트 개수를 줄이거나 시간이 더 걸릴 수 있는 add, remove를 사용하지 않는 방향을 생각해 봐야겠다.