본문 바로가기
JAVA

[JAVA][백준] 1181_단어정렬 (Comparator)

by saemsaem 2024. 4. 18.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class sortingWord_1181 {
    public static void main (String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] arr = new String[n];

        for (int i = 0; i < n; i++) {
            arr[i] = br.readLine();
        }

        Arrays.sort(arr);
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });

        for (int i = 0; i < n; i++) {
            System.out.println(arr[i]);
        }
	}
}

 

길이를 먼저 정렬하고, 알파벳 순으로 정렬해야 한다고 생각했는데, 
알파벳으로 정렬한 후에 길이 순으로 정렬하는 순서가 맞았다. 

알파벳으로 정렬하기 위해서는 그냥 sort함수를 사용하면 됐는데, 길이를 정렬하기 위해서는 'Comparator'를 사용해야 한다. 


Comparator

@override
public int compare (String o1, String o2) {
	return o1.compareTo(o2);
}

o1, o2를 비교하여
o1 < o2 이면 -1, 
o1 = o2 이면 0,
o1 > o2 이면 1을 return한다. 


따라서, 재사용하지 않기 때문에 익명 객체로 만들면

Arrays.sort(arr, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
});

이때, 글자수 기준으로 정렬을 하려면 return 값만 수정해주면 된다.

return o1.length() - o2.length();

람다식을 사용하면

Arrays.sort(arr, (s1, s2) -> s1.compareTo(s2));

더 간단한 작성 방법으로는 

Arrays.sort(arr, Comparator.comparing(String::length)).reversed();

.reversed() 는 역순으로 출력하기 위한 것이다. 

:: 은 클래스의 메서드를 참조하는 것으로,
String class의 length() 메서드 반환값을 이용하겠다는 의미이다. 
다른 표현방법으로 작성하면,

Comparator.comparing (s -> s.length());

 

'JAVA' 카테고리의 다른 글

[JAVA][백준] 7568_덩치  (0) 2024.04.22
[JAVA][백준] 2751_수 정렬하기 2  (0) 2024.04.18
[JAVA][백준] 10989_수 정렬하기 3 (BufferedReader)  (0) 2024.04.16
[JAVA][백준] 1978_소수 찾기  (0) 2024.04.15
[JAVA][백준] 10809_알파벳  (0) 2024.04.15