문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
입력
첫째 줄에 단어의 개수 N이 주어진다.
(1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다.
주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.
해결 방법
- Array나 List에서 내가 정의한 정렬 기준으로 정렬하고 싶으면 Comparator를 사용하면 된다.
- compare 메소드를 오버라이드 한다
- 단어의 길이가 같으면 compareTo로 두 단어를 비교한다
- o1 > o2 이면 양수를, o1 < o2 이면 음수, o1 == o2 이면 0을 반환해야 오름차순으로 정렬된다.
- 단어의 길이가 같지 않으면 단어의 길이로 오름차순 정렬한다.
- 단어의 길이가 같으면 compareTo로 두 단어를 비교한다
- 정렬된 배열에서 중복이 있으면 제거한다.
public class Week02_1181 { public static void main(String[] args) throws IOException { // input BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 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) { // 단어의 길이가 같으면 if (o1.length() == o2.length()) { // 사전순(오름차순) 정렬 return o1.compareTo(o2); } // 단어의 길이가 다르면 길이가 짧은 순서(오름차순)로 정렬 else return o1.length()-o2.length(); } }); // 중복 제거 bw.write(arr[0]+"\n"); for (int i = 1; i < n; i++) { if (!arr[i].equals(arr[i - 1])) { bw.write(arr[i] + "\n"); } } bw.flush(); bw.close(); br.close(); } }
'algorithm' 카테고리의 다른 글
| [BOJ] 1764. 듣보잡 (0) | 2022.10.21 |
|---|---|
| [BOJ] 17298. 오큰수 (0) | 2022.10.21 |
| [BOJ] 2309. 일곱 난쟁이 (0) | 2022.10.21 |
| [BOJ] 1620. 나는야 포켓몬 마스터 이다솜 (0) | 2022.10.21 |
| [BOJ] 10828. 스택 (0) | 2022.10.19 |