⏰문제
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
2 초 | 256 MB | 169690 | 71011 | 53244 | 40.32% |
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
예제 입력 1
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
예제 출력 1
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate
💡풀이
단어를 길이가 짧은 순으로 정렬한 후(오름차순), 길이가 같다면 사전 순(오름차순)으로 정렬을 하라고 했다.
배열을 사용하는데 이 경우는 특정한 규칙에 의해 정렬해서 Arrays.sort 메소드에 Comparator을 구현했다.
이 때 compare메소드의 return값을 o1.length() - o2.length()로 한 이유는 이 반환값을 기준으로 정렬을 하기 때문이다.
반환값은 양의 정수, 0, 음의 정수로 총 3개의 값으로 구성되어 있다.
그리고 Arrays.sort()에서 정렬 알고리즘은 아래를 따른다.
양수 -> 정렬 알고리즘에 의해 위치를 바꾼다.
0이나 음의 정수 -> 두 객체의 위치를 바꾸지 않는다.
그래서 {3,1,2}라는 배열이 있다고 할 때, comapre에 o1,o2가 각각 3,1이라고 할 때, return값은 3-1 = 2(양의 정수)가 되어 자리를 바꾼다. 마찬가지로 3-2 = 1(양의 정수)가 되어 자리를 바꾸게 되고, 최종적으로 {1,2,3}이 되어 오름차순으로 정렬된 배열이 되는 것이다.
⌨️ 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class baek1811_단어정렬 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] word = new String[N];
for(int i=0; i<N; i++){
word[i] = br.readLine();
}
Arrays.sort(word, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length() == o2.length()){
return o1.compareTo(o2);
}
return o1.length() - o2.length();//오름차순
}
});
//중복된 단어 제거
StringBuilder sb = new StringBuilder();
sb.append(word[0]).append('\n');
for(int i=1; i< N; i++){
if (!word[i].equals(word[i - 1])) {
sb.append(word[i]).append('\n');
}
}
System.out.println(sb);
}
}
📣 comment
알고리즘 스터디에서 정렬을 사용할 일이 있었는데 Comparable과 Comparator에 대해서 더 배우면 좋을 것 같기도 하고, solved.ac class2를 완수하기 위해서 풀었던 문제이다. 이 인터페이스 같은 경우는 사용할 일이 많아서 익숙해지면 좋을 것 같다.
'⚙️알고리즘' 카테고리의 다른 글
프로그래머스) 부대복귀 (0) | 2024.02.05 |
---|---|
백준) 11650 : 좌표 정렬하기 (0) | 2024.01.10 |
백준) 11050 : 이항계수 (0) | 2024.01.09 |
백준) 1920 : 수 찾기 (2) | 2024.01.08 |
백준) 10845 : 큐 (0) | 2024.01.06 |