입력 : 첫째 줄 - 단어 개수 (1 ≤ 단어 개수 ≤ 20,000)
둘째 줄부터 - 알파벳 소문자로 이루어진 단어 (1 ≤ 길이 ≤ 50)
출력 : 길이 오름차순으로 단어 출력. 단, 길이가 같으면 사전 순으로 먼저 출력하고,
중복된 단어는 하나만 출력한다.
O(NlogN)
팀소트 알고리즘
sc.nextLine(); 를 사용한다면 남아있는 개행 문자를 소비해야 한다.
sc.next(): 공백, 탭, 엔터를 기준으로 단어 단위로 입력을 읽음.
sc.nextLine(): 엔터(줄바꿈 문자)를 기준으로 한 줄 전체를 입력을 읽음.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
sc.nextLine(); //개행 문자 소비
String[] words = new String[N];
for (int i = 0; i < N; i++) {
words[i] = sc.nextLine();
}
Arrays.sort(words, new Comparator<String>() {
public int compare(String a, String b) {
if (a.length() == b.length()) {
return a.compareTo(b);
} else {
return a.length() - b.length();
}
}
});
Set<String> uniqueWord = new LinkedHashSet<>(Arrays.asList(words));
for (String word : uniqueWord) {
System.out.println(word);
}
sc.close();
}
}
또는 - 개행문자 제거 없이 next(); 사용
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
String[] words = new String[N];
for (int i = 0; i < N; i++) {
words[i] = sc.next();
}
Arrays.sort(words, new Comparator<String>() {
public int compare(String a, String b) {
if (a.length() == b.length()) {
return a.compareTo(b);
} else {
return a.length() - b.length();
}
}
});
Set<String> uniqueWords = new LinkedHashSet<>(Arrays.asList(words));
for (String word : uniqueWords) {
System.out.println(word);
}
sc.close();
}
}