N개의 String을 입력 받은 후,
1. 길이가 짧은 순
2. 길이가 같다면 사전순
으로 출력하는 프로그램을 구현한다
제한시간이 2초였는데 2404ms로 간신히 통과했다😭
comparator의 사용법이 생각이 안나서 Arrays.sort() 메서드만 사용해서 어찌저찌 풀려고 하다보니 이렇게 되어버렸다.
그래서 일단 나의 코드를 첨부한 후, comparator와 comparable의 사용법을 복습해보았다.
package Baekjoon;
import java.util.*;
import java.io.*;
public class BOJ1181 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
String[] input = new String[n];
/**
* 사전순 배열 -> for문을 50번 반복해서 해당 글자 길이의 문자열을 순서대로 출력
*/
st = new StringTokenizer(br.readLine());
input[0] = st.nextToken();
for(int i = 1; i < n; i++){
boolean same = false;
st = new StringTokenizer(br.readLine());
String str = st.nextToken();
//같은 단어가 있는지 찾는다
for(int j = 0; j < i; j++){
if(str.equals(input[j])) same = true;
}
//같은 단어가 있다면 문자열 대신 1을 넣음
if(same) input[i] = "1";
else input[i] = str;
}
Arrays.sort(input);
for(int i = 1; i <= 50; i++){
for(int j = 0; j < n; j++){
if(input[j].length() == i && !input[j].equals("1")) System.out.println(input[j]);
}
}
}
}
배열을 정렬할 때 Arrays.sort()를 많이 호출하는데, 이것은 Character클래스의 Comparable의 구현에 의해 정렬되는 것이다.
Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다.
이 밖에도 Comparable의 특징으로는
- 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들로 구현된다
- 기본적으로 오름차순으로 정렬된다
두 가지를 활용 시기로 분류를 하자면,
- Comparable : 기본 정렬기준을 구현하는데 사용
- Comparator : 기본 정렬기준 외에 다른 정렬 기준을 구현하고 할 때 사용
즉, String[]을 정렬하고자 할 때 Arrays.sort()를 사용함에 있어서
Arrays.sort(arr, Comparator c)
이렇게 Comparator를 지정해주지 않으면 기본적으로 Comparable에 의해 정렬이 되는 것이다.
따라서, 이런 Comparator를 사용해서 위 코드의 Array.sort() 부분을 수정해보면 다음과 같다
Arrays.sort(input, Comparator<String>(){
public int compare(String s1, String s2){
//1. 길이가 같다면 사전순
if(s1.length() == s2.length()){
return s1.compareTo(s2);
}
//2. 길이를 기준으로 오름차순
else{
return s1.length() - s2.length();
}
}
}