자바 list의 sublist 사용해서 배열을 거꾸로 배치하는 코딩

조회수 366회

리스트를 거꾸로 배치하는 함수를 두 개를 작성해서 메인 함수에서 테스트해보려고 돌려봤는데요. sublist를 사용하여 작성한 함수에서 자꾸 arr 리스트에 특정 수들이 추가 되는 것 같습니다. 그래서 두번 째 함수를 똑같은 입력으로 테스트를 하면 다르게 출력이 되는 것 같아요. 리스트 슬라이싱 하는 방법이 sublist 말고 다른 방법이 있는지 궁금하고, 왜 추가가 되는건지 모르겠어서....도와주세요!!

public static List<Integer> reverse(List<Integer> arr) {
    if (arr.size() == 1) {
        return arr;
    }
    int base = arr.get(0);
    arr = arr.subList(1, arr.size());
    arr = reverse(arr); // arr에 reverse(arr)을 대입하지 않았을 때 왜 base 값이 붙어서 나오는지 궁금
    arr.add(base);
    return arr;
}

public static List<Integer> reverse(List<Integer> arr, int start, int end) {
    if (start < end - 1) {
        int base = arr.get(start);
        arr.set(start, arr.get(end - 1));
        arr.set(end - 1, base);
        return reverse(arr, start + 1, end - 1);
    } else {
        return arr;
    }
}

public static void main(String[] args) {
    List<Integer> arr = new ArrayList<>(Arrays.asList(1,2,3,4,5,6));
    List<Integer> arr2 = new ArrayList<>();
    List<Integer> arr3 = new ArrayList<>();
    arr2 = reverse(arr);
    for (int a : arr2) {
        System.out.print(a + " ");
    }
    System.out.println();

    arr3 = reverse(arr, 0, 6);

    for (int a : arr3) {
        System.out.print(a + " ");
    }
}

}

1 답변

  • #1

    출력값이 이상한 것은 원본 리스트인 arr가 변형됐기 때문이에요. 변형된 객체를 재사용하니 뭔가 붙어있는 것처럼 보이는 거죠.

    arr는 원본 그대로 유지하고 복제를 만들어 다루는 방식으로 고쳐보세요.

    #2

    공부하는 입장에선 치트에 가깝지만 java.util.Collections.reverse() 메서드가 있습니다.

    List<Integer> arr = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6));
    Collections.reverse(arr); // 전달인자가 변형(mutation)되는 메서드    
    System.out.println(arr); // [6, 5, 4, 3, 2, 1]
    
    • sort 메서드와 Comparator.reverseOrder()를 사용해서 역순으로 재정렬하는것도 가능하지요. 노을 2022.7.29 04:21

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)