알파벳 소문자로 이루어진 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
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
ArrayList<String> list = new ArrayList();
for( int i = 0 ; i < num ; i++ ) {
String str = sc.next();
if(!list.contains(str)) list.add(str);
}
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
if( o1.length() > o2.length())
return 1;
if( o2.length() > o1.length())
return -1;
return o1.compareTo(o2);
}
});
for( String str : list) {
System.out.println(str);
}
}
}
contains함수를 활용해 단어의 중복을 방지하기 위해서 배열을 활용하지 않고 ArrayList를 활용했다.
Collections클래스에서 제공하는 sort를 커스텀해서 활용했다.
Comparator를 생성해서 compare함수를 오버라이딩 함으로써 커스텀하는 방식으로 구현했다.
해당 문제는 11650번문제 풀이와 비슷한 문제로 인식했고, 같은 방식으로 문제를 풀었다.
String끼리의 비교 (사전순)
String a = "abc"
String b = "def"
일 경우
a.compareTo(b)는 양수이고
b.compareTo(a)는 음수,
a.compareTo(a)는 0이다.
compare함수의 알고리즘
단어의 길이가 차이가 있을 경우 각 경우에 알맞게 양수와 음수를 리턴시킨다.
길이의 차이가 없을 경우 사전순으로 정렬해야하기 때문에 compareTo로 비교하여 리턴한다.