[작성일: 2023. 10. 23]
https://www.acmicpc.net/problem/1181
풀이
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] strArr = new String[n];
for (int i = 0; i < n; i++) {
strArr[i] = sc.next();
}
Set<String> set = new HashSet<>();
for (int j = 0; j < strArr.length; j++) {
set.add(strArr[j]);
}
List<String> list = new ArrayList<>(set);
Collections.sort(list, (a, b) -> {
if (a.length() != b.length()) {
return a.length() - b.length();
} else {
return a.compareTo(b);
}
});
for (String str : list) {
System.out.println(str);
}
}
}
처음에는 문자열을 입력받은 후 String 배열에 저장하고, 중복을 제거하기 위해 set에 다시 저장한다.
set은 중복을 허용하지 않지만 순서도 보장하지 않기 때문에 set에서 중복제거된 문장을 다시 ArrayList에 저장한다.
Collections.sort를 이용해서 중복제거된 문장들을 정렬해야 하는데 조건은
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
위와 같으므로 우선 list의 a 문장과 b 문장의 길이를 비교해본다.
만약 a의 길이가 b의 길이보다 크면 양수, 작으면 음수, 같다면 0이 된다.
if에서 문장의 길이가 다른 경우 길이가 짧은 문자열을 먼저 오도록 정렬하게 된다.
길이가 같은 경우에는 compareTo를 사용해서 a와 b 문자열을 사전 순으로 비교한다.
마찬가지로 0을 반환하면 동일한 문자열, 양수를 반환하면 a가 b보다 사전 순으로 뒤에 오는 문자열, 음수를 반환하면 a가 b보다 사전 순으로 앞에 오는 문자열이라는 의미가 된다.