❓ 문제
알파벳 소문자로 이루어진 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
👩🏻💻 내 코드
package baekjoon.코테챌린지;
import java.util.*;
public class 단어정렬 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
Set<String> words = new HashSet<>();
for(int i = 0; i < N; i++) {
words.add(in.nextLine());
}
List<String> wordList = new ArrayList<>(words);
Collections.sort(wordList, (word1, word2) -> {
if (word1.length() == word2.length()) {
return word1.compareTo(word2);
} else {
return word1.length() - word2.length();
}
});
for (String word : wordList) {
System.out.println(word);
}
}
}
💡 공부 내용 < Set, ArrayList, compareTo >
Set<String> words = new HashSet<>();
- Set의 특징
- Set은 중복된 데이터를 허용하지 않고, 이를 통해 입력된 단어들 중 중복된 단어를 자동으로 제거할 수 있다. 문제에서 중복된 단어는 제거하라고 명시되어 있기 때문에 Set을 사용하여 이 문제를 해결한다.
List<String> wordList = new ArrayList<>(words);
- words라는 Set 자료구조를 ArrayList로 변환한 이유
- 정렬을 하기 위해서!!
- 왜 ArrayList로 변환?
- Set은 기본적으로 순서를 보장하지 않기 때문에 정렬이 필요할 때는 List로 변환해 정렬 작업을 진행할 수 있다.
Collections.sort(wordList, (word1, word2) -> {...});
- Collections.sort() 메서드는 리스트에 있는 요소들을 원하는 기준에 따라 정렬해준다. 여기서 Comparator를 사용하여 두 가지 조건으로 단어를 정렬한다.
1. 길이 순으로 정렬
if (word1.length() == word2.length()) {
- 문제에서 "길이가 짧은 것부터" 정렬하라는 조건을 만족시키기 위해 단어의 길이가 같을 때만 사전순으로 비교하게 하고, 그렇지 않다면 길이에 따라 먼저 정렬한다.
return word1.length() - word2.length();
- 길이가 다를 경우, 더 짧은 단어가 먼저 오도록 길이 차이(word1.length() - word2.length())를 반환한다. 길이가 짧은 단어는 음수 값을 반환하여 정렬 시 앞쪽에 위치하게 된다.
2. 사전 순으로 정렬
return **word1.compareTo(word2);**
- 두 단어의 길이가 같을 때는, 문제의 두 번째 조건에 맞게 사전순으로 정렬한다.
- Java의 String 클래스에서 제공하는 compareTo() 메서드는 두 문자열을 사전 순으로 비교해준다. 이 메서드는 사전순으로 비교해 앞서는 문자열이 더 작은 값(음수)을 반환하도록 설계되어 있다.
"길이가 짧은 것부터", "길이가 같으면 사전 순"이라는 두 가지 조건을 모두 충족시키기 위해서는 Comparator를 사용하여 두 가지 기준을 처리해야 한다.
1. 먼저 길이로 정렬하고,
2. 길이가 같을 경우에만 사전 순으로 정렬
반응형
'백준 문제 풀이' 카테고리의 다른 글
<코테 챌린지> 커트라인 (백준 25305번) (1) | 2024.10.11 |
---|---|
<코테 챌린지> 생일 (백준 5635번) (0) | 2024.10.10 |
<코테 챌린지> 나이순 정렬 (백준 10814번) (1) | 2024.10.09 |
(#10952 Java) A+B - 5 (0) | 2023.07.31 |
(#11022 Java) A+B -8 (0) | 2023.07.29 |