알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
조건에 따라 정렬하여 단어들을 출력한다.
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate
처음에는 List로 만들어 가변적으로 삽입하며 순서를 만들어 갈 방법을 고안했었다.
그런데 아무리 생각해도 이 방법은 너무 복잡한 것 같았고, 좀 더 찾아보면 이보다 더 쉬운 구현을 할 수 있을 것 같아 검색을 해보니 sort()에 직접 자신이 설정하는 방법으로 비교하여 정렬 할 수 있다는 것을 알게 되었다.
특히 이 문제에서 가장 중요한 것은 다중조건 이었는데, 해당 기능도 Comparator를 사용하면 바로 구현이 가능했다.
package 백준;
// #1181 단어정렬(https://www.acmicpc.net/problem/1181)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class 단어정렬 {
public static void main(String[] args) throws Exception{
// 입력 받기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String [] data = new String[n];
StringTokenizer st;
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine());
data[i] = st.nextToken().toString();
}
// List를 다중조건으로 정렬하는 방법: Comparator & .thenComparing()의 사용 !
Arrays.sort(data, Comparator.comparingInt(String::length).thenComparing(String::valueOf));
// 다중조건 사용 x, 길이만으로 정렬
// Arrays.sort(data, (a, b)->Integer.compare(a.length(), b.length()) );
// System.out.println("** 출력");
for(int i=0; i<n; i++){
if(i!=(n-1) && data[i].equals(data[i+1]))
continue;
System.out.println(data[i]);
}
}
}
Comparator.comparing()
를 하면 오름차순이 기본이고,
Comparator.comparing().reversed()
를 해주면 내림차순이 된다.