-
[정렬] 문제 이름 : 위에서 아래로 - List<E> 정렬, CollectionsAlgorithm/유형별 문제 풀기 2021. 8. 18. 12:35
문제 설명
주어진 수열의 값은 크기에 상관없이 나열되어 있다. 이 수를 큰 수부터 작은 수의 순서로 정렬해야 한다. 수열을 내림차순으로 정렬하는 프로그램을 작성하시오.
입력조건)
첫 째 줄에 수열에 속해 있는 수의 개수 N이 주어짐 ( 1 <= N <= 500)
둘째 줄부터 N + 1번째 줄까지 N개의 수가 입력됨
수의 범위는 1 이상 100,000 이하의 자연수
사용 개념
가장 기본적인 정렬을 할 수 있는지 물어보는 문제
문제 해결 아이디어
문제의 조건을 보면 수의 개수가 500개 이하로 매우 적으며, 모든 수는 1~100,000 이하이므로 어떠한 정렬 알고리즘을 사용해도 문제를 해결할 수 있음
코드
구현방식)
ㄱ. 입력 받은 값을 ArrayList에 저장하기 위해 리스트 선언 및 생성함
ㄴ. ArrayList 내림차순 정렬을 위해 Collections 클래스의 reverseOrder()와 sort() 메서드를 사용함
→ 이때 List의 제네릭 타입이 Integer인데, Integer 클래스는 오름차순 정렬을 구현해놓음 (Comparable 인터페이스를 구현하여 compareTo() 메소드를 오버라이딩하여 오름차순 정렬을 구현)
→ Integer 클래스의 메소드를 변경할 수는 없으므로, 내림차순 정렬을 하기 위해서는 내림차순을 구현한 Comparator 타입의 클래스 객체를 sort() 메서드의 인자로 전달해줘야 함
→ 이때 Collections 클래스에서 내림차순을 구현한 Comparator 타입의 클래스 객체를 제공해줌
그것이 바로 Collections 클래스의 static 메소드인 reverseOrder() 임!
→ Collections 클래스에 정의되어 있는 코드를 보면 reverseOrder()가 Comparator<T> 타입의 객체를 반환함
→ Comparator<T> 인터페이스를 구현한 ReverseComparator 클래스가 compare() 메소드 오버라이딩을 통해 내림차순을 구현함
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner kbd = new Scanner(System.in); int N = kbd.nextInt(); List<Integer> arr = new ArrayList<>(); // ㄱ. 리스트 선언 및 생성 for(int i = 0; i < N; i++) { arr.add(kbd.nextInt()); } Collections.sort(arr, Collections.reverseOrder()); // ㄴ. 리스트 정렬 for(int i = 0; i < N; i++) System.out.print(arr.get(i) + " "); kbd.close(); } }
추가 개념 정리
List<E> 정렬 - 2가지 방식
→ java.util 패키지의 Collections 클래스의 static method를 사용함
선택1) List의 제네릭 타입으로 사용된 클래스에서 정의한 정렬 방식 그대로 사용하는 경우 - 거의 오름차순이 대부분 임
선택2) 내림차순 정렬이나 다른 방식으로 정렬해야 하는 경우
→ 위의 문제에서처럼 Integer 클래스와 같이 변경 불가능한 클래스들을 제네릭 타입으로 사용할 경우 'Comparator<T> 인터페이스를 구현하여 compare() 메소드를 오버라이딩한 새로운 클래스를 정의하여' 해당 클래스의 객체를 sort()의 인자로 전달해줘야 함
참고)
2021.07.30 - [Algorithm/HackerRank] - [Greedy] 문제 이름 : University Career Fair - 사용자 정의 클래스 객체 정렬
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collections.html
'Algorithm > 유형별 문제 풀기' 카테고리의 다른 글
[배열 정렬] 문제 이름 : 두 배열의 원소 교체 (0) 2021.09.30 [정렬] 문제 이름 : 성적이 낮은 순서로 학생 출력하기 - 객체 정렬, List<T>, Collection (0) 2021.09.16 [DFS/BFS] 문제 이름 : 미로 탈출 (0) 2021.07.08 [DFS/BFS] 문제이름 : 음료수 얼려 먹기 (0) 2021.07.05 [구현] 문제이름 : 게임 개발 (0) 2021.06.30