TIL(Today I Learned)
99클럽 코테 스터디 13일차 TIL + 백준 1181 (단어 정렬, java)
zincah
2025. 4. 16. 21:05
반응형
오늘의 학습 키워드
- 정렬
문제 탐색하기
문제
문제 풀이 설계하기
문제를 풀기위해서는 주어진 조건에 따라 문자열을 정렬시켜 줘야합니다. 정렬 조건을 직접 제시하는 것으로 봐서 java의 Collections를 활용해서 정렬 조건을 커스텀해서 문제를 풀 수 있을 것 같습니다.
컬렉션 프레임워크 정렬에 대한 간단한 개념
자바는 Collections 클래스를 제공합니다. Collection에 대한 다양한 작업을 수행하는 정적 메서드를 제공하는데, 이 중에서 컬렉션을 정렬하는 메서드는 sort()입니다.
Collections.sort() 메서드는 두 가지 방식으로 정렬을 수행할 수 있습니다.
- Comparable 사용 : 자체 비교(Natural Ordering), 컬렉션의 요소들이 Comparable 인터페이스를 구현하고 있는 경우, Collections.sort()는 이 인터페이스의 compareTo() 메서드에 정의된 자연스러운 순서(natural ordering)에 따라 요소를 정렬합니다. 예를 들어, Integer, String, Date 클래스는 Comparable을 구현하고 있으며, 숫자, 사전 순서, 시간 순서대로 정렬됩니다.
- Comparator 사용 : 외부 비교(Comparator): 컬렉션의 요소들이 Comparable을 구현하지 않았거나, 기본 자연스러운 순서가 아닌 다른 기준으로 정렬하고 싶은 경우, Comparator 인터페이스를 구현한 객체를 Collections.sort() 메서드의 두 번째 인자로 전달하여 정렬 방식을 지정할 수 있습니다. Comparator 인터페이스의 compare() 메서드는 두 객체를 비교하여 정렬 순서를 결정합니다.
여기서 저는 이 문제를 comparator를 익명 내부 클래스로 선언해서 문제를 풀도록 하겠습니다.
코드
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> set = new HashSet<>();
for(int i=0; i<N; i++){
set.add(br.readLine());
}
ArrayList<String> list = new ArrayList<>(set);
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
int check = Integer.compare(o1.length(), o2.length());
if(check == 0){
return o1.compareTo(o2);
}
return check;
}
});
for(String str : list){
System.out.println(str);
}
}
}
오늘의 회고
오늘 풀었던 문제를 보니 예전에도 2번이나 풀었던 문제였습니다. 그런데도 불구하고 왜 매번 collections 정렬을 통해 문제를 풀려고하면 찾아봐야하는지... 이번에는 좀 더 오래 활용할 수 있도록 개념을 정리해서 블로그 글을 작성해 보았습니다.
반응형