알고리즘 문제풀이/백준
[백준 1187] 단어 정렬
선서니
2023. 1. 30. 21:01
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
💡풀이💡
단어들을 1) 길이가 짧은 순서대로 2) 길이가 같다면 사전 순서대로 정렬하는 것이 문제이다.
하지만 이러한 정렬은 메서드로 정의되어 있지 않기 때문에 기존에 있는 Arrays.sort()를 재정의해서 위와 같이 정렬이 될 수 있도록 했다.
1. 입력 값 받기
N개 단어를 입력 받은 String 타입의 배열을 생성하고 단어들을 배열에 저장했다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuffer sb = new StringBuffer();
int N = Integer.parseInt(br.readLine());
String[] arr = new String[N];
for(int i=0; i<N; i++) {
arr[i] = br.readLine();
}
2. Arrays.sort()를 재정의
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int r = o1.length() - o2.length(); // 1. 길이 비교 - 같으면 0을 리턴
if(r == 0) r = o1.compareTo(o2); // 같을 때 사전순 정렬
return r;
}
});
3. 중복되는 단어 거르기
sb.append(arr[0]).append("\n"); // 아래 for문에서는 0번째 요소가 포함되지 않기 때문에먼저 추가
for(int i=1; i<N; i++) {
if(!arr[i].equals(arr[i-1])) { // arr[i] 와 arr[i-1]이 같을 때
sb.append(arr[i]).append("\n");
}
}
System.out.println(sb.toString());
4. 전체 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuffer sb = new StringBuffer();
int N = Integer.parseInt(br.readLine());
String[] arr = new String[N];
for(int i=0; i<N; i++) {
arr[i] = br.readLine();
}
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int r = o1.length() - o2.length();
if(r == 0) r = o1.compareTo(o2);
return r;
}
});
sb.append(arr[0]).append("\n");
for(int i=1; i<N; i++) {
if(!arr[i].equals(arr[i-1])) {
sb.append(arr[i]).append("\n");
}
}
System.out.println(sb.toString());
}
}