코딩테스트/백준
[백준 1181] 단어정렬 (Java) - 정렬
imachill7guy
2025. 5. 6. 18:18
https://www.acmicpc.net/problem/1181
단어 정렬
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
예제 입력 1 복사
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
예제 출력 1 복사
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate
1. 내가 처음으로 푼 쓰레기 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
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());
ArrayList<String> words = new ArrayList<>();
for (int i=0; i<N; i++){
String word = br.readLine();
if (words.contains(word)) continue; // 이미 있는 단어라면 건너뛰기
words.add(word);
}
words.sort(Comparator.comparingInt(String::length)
.thenComparing(w -> w)
);
StringBuilder sb = new StringBuilder();
for (int i=0; i<words.size(); i++){
sb.append(words.get(i)+"\n");
}
System.out.println(sb);
}
}
- 정렬을 활용한 문제
- 단어의 길이가 짧은 것부터 정렬하되, 길이가 같으면 사전순으로 정렬한다
- 단, 중복된 단어는 하나만 남기고 제거한다.
2. 개선코드
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> wordSet = new HashSet<>();
for (int i=0; i<N; i++){
wordSet.add(br.readLine());
}
List<String> words = new ArrayList<>(wordSet);
words.sort(Comparator
.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder())
);
StringBuilder sb = new StringBuilder();
for (String word : words){
sb.append(word).append("\n");
}
System.out.println(sb);
}
}
- 중복단어에 있어서는 List내부의 값을 비교하지 않고, 애초에 Set을 사용해서 중복을 제거해주었다.
- 이후 정렬을 해주기 위해서 wordSet을 List에 넣어준다.
- Comparator에서 String::length를 오름차순 정렬해주고, thenComparing을 통해서 Comparator.naturalOrder()로 사전순정렬을 수행한다.