[Java] 백준(실버-5) 1181번 - 단어 정렬

문제 풀이
이 문제를 풀기 위해 생각한 아이디어는 다음과 같다.
- 길이가 짧은 순 정렬 -> 같은 길이의 단어는 사전 순 정렬 -> 중복 제거 -> 출력
Arrays.sort() 함수는 두 객체를 비교하여 위치 정렬을 하는데, 특정 규칙을 만들어 비교하기 위해서 앞서 많이 사용하였던 Comparator를 활용하려 한다.
입력받은 단어들을 String 배열에 담아서 정렬해야 하고, Comparator의 compare 메소드를 재정의하여 길이가 짧은 순서로, 같은 길이의 단어는 사전 순서로 정렬하는 규칙을 만들어야 한다.
Comparator와 Comparator의 compare를 재정의하는 코드는 아래과 같다.
1
2
3
4
5
6
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
...
}
});
문자열 길이 짧은 순서로 정렬하기
먼저 주어진 단어들을 길이가 짧은 순으로 정렬해야 한다.
양수, 음수로 판단하여 정렬하기 때문에 앞 뒤 단어 길이의 차를 반환하여 길이가 짧은 순서로 정렬할 수 있다.
1
2
3
4
5
6
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
같은 길이의 단어를 사전 순서로 정렬하기
다음으로 같은 길이를 가진 단어일 경우 사전순으로 정렬해야 한다.
문자열을 사전순으로 정렬할 때 많이 사용하는 compareTo() 메소드를 활용하면 된다.
compareTO()란?
두 개의 값을 비교하여 int값으로 반환해주는 함수이며, 문자열의 비교, 숫자의 비교 방식이 존재한다. 기준값과 비교값이 같다면 0을 반환하지만 기준값에 비교대상이 포함되어있을 경우 서로의 문자열 길이의 차이값을 아스키로 변환된 차의 값으로 반환한다.
compareTo() 메소드는 문자열 비교, 숫자의 비교 두가지 방식이 있는데, 여기선 문자열 비교 방식을 활용한다.
앞 뒤 문자의 길이가 같을 경우 compareTo() 메소드를 통해 사전순으로 정렬할 수 있다.
1
2
3
4
5
6
7
8
9
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.length() == s2.length()) {
return s1.compareTo(s2);
}
return s1.length() - s2.length();
}
});
중복 제거
중복 제거는 간단하다. 현재 문자와 이전 문자가 다를 경우에만 출력하면 된다.
1
2
3
4
bw.write(arr[0]+"\n"); // 1번째 원소부터 비교하기에 먼저 0번째 원소 출력
for(int i=1; i<arr.length; i++) {
if(!arr[i].equals(arr[i-1])) bw.write(arr[i] + "\n");
}
작성코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
String[] arr = new String[N];
for(int i=0; i<arr.length; i++) {
arr[i] = br.readLine();
}
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.length() == s2.length()) {
return s1.compareTo(s2);
}
return s1.length() - s2.length();
}
});
bw.write(arr[0]+"\n");
for(int i=1; i<arr.length; i++) {
if(!arr[i].equals(arr[i-1])) bw.write(arr[i] + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
회고
- 문자열 정렬을 위해 Comparator의 compare 메서드를 오버라이딩하여 재정의할 수 있었다.
- 두개의 문자를 비교하여 사전순으로 정렬할 수 있는 compareTo() 함수에 대해서 공부할 수 있었다.