알고리즘 분류
- 문자열
- 정렬
이전에 알고리즘 스터디에서 풀었던 문제인데
문제를 보자마자 아 어떻게 하더라.. thenComapring이런거 써서
연결했던 것 같은데.. 밖에 생각 안나더라
여태까지 Arrays.sort에 compare 메서드 구현하는 것도 여러 번 했었는데 잘 기억 안남 ㅜㅜ
이번에 제대로 정리해보자
먼저 내가 푼 방법은 구글링을 통해 찾은 compare 메서드다.
Arrays.sort + Comparator compare 메소드 구현
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
HashSet<String> set = new HashSet<>();
for (int i = 0; i < N; i++) {
set.add(br.readLine());
}
String[] words = set.toArray(new String[0]);
Arrays.sort(words, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
} else {
return s1.length() - s2.length();
}
}
});
for (int i = 0; i < words.length; i++) {
System.out.println(words[i]);
}
}
}
중복값 제거를 위해 set에 값들을 넣어줬고,
set을 배열로 변환했다.
String[] words = set.toArray(new String[0]);
과 같이 작성했다.
이후 Arrays.sort에 Comparator를 써서 compare 메소드를 구현했다.
길이가 짧은 것부터 -> 길이가 같으면 사전 순으로 정렬해야 하므로
if 길이가 같으면 사전 순으로 정렬, 그렇지 않으면 길이순 정렬을 한다.
단어 사전순 정렬은 compareTo() 메소드를 쓰면 된다!
Arrays.sort 정렬하기
Arrays.sort는 기본적으로 인자를 2가지 받는다.
Arrays.sort(arr, new Comparator<>)
보편적으로 Arrays.sort(arr) 이렇게 인자를 하나만 줄 경우 Comparator는 default 값으로 적용되어 진행되는 것이다.
(정수 정렬할 때는 default 값으로 진행해도 무리가 없다.)
그러나 문자열을 정렬하기 위해서는 따로 재정의가 필요하다. (그냥 default로 둘 경우 사전 순 정렬)
- Arrays.sort()의 Comparator 재정의
Arrays.sort(arr, new Comparator<String>() {
});
Comparator 객체를 생성하여 넣어준다.
- Comparator에 있는 메서드 compare 오버라이딩
(기존에 있는 Comparator 인터페이스로 정의된 compare 함수 재정의)
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
}
});
- 문자열의 길이 정렬
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s1.length();
}
});
- 문자열 길이가 같다면 사전 순 정렬
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.length() == s2.length()) {
return s1.compareTo(s2);
} else {
return s1.length() - s1.length();
}
}
});
예전에 썼던 thenComparing은 뭐였는지 보기로 했다.
package B1181_단어정렬;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Set<String> words = new HashSet<>();
for(int i = 0; i < N; i++) {
String word = br.readLine();
words.add(word);
}
List<String> wordsList = new ArrayList<>(words);
wordsList.sort(Comparator.comparingInt(String::length) // 길이가 짧은 것부터
.thenComparing(Comparator.naturalOrder())); // 길이가 같으면 사전 순으로
for (String word : wordsList) {
System.out.println(word);
}
}
}
함수형 인터페이스의 특징을 활용해 간결하게 적은 버전이다.
Comparator.comparingInt(String::length)를 통해 String 객체의 길이를 비교하는 Comparator를 생성하고
이후 thenComparing(Comparator.naturalOrder())를 통해 추가적인 Comparator를 지정한다.
흠 이 방법보다는 위처럼 Comparator의 compare 메소드 재정의가 직관적이고
작성하기 편할 것 같다!
'Languages > Java' 카테고리의 다른 글
[BOJ 길라잡이/Java] 7일차 #11651 좌표 정렬하기 2 (0) | 2025.03.17 |
---|---|
[BOJ 길라잡이/Java] 7일차 #11650 좌표 정렬하기 (0) | 2025.03.17 |
[BOJ 길라잡이/Java] 5일차 #1026 보물 (0) | 2025.03.11 |
[BOJ 길라잡이/Java] 5일차 #1406 에디터 (0) | 2025.03.11 |
[BOJ 길라잡이/Java] 5일차 #10866 덱 (0) | 2025.03.11 |