본문 바로가기
백준 문제 풀이

<코테 챌린지> 단어 정렬 (백준 1181번)

by _비니_ 2024. 10. 9.

❓ 문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

단, 중복된 단어는 하나만 남기고 제거해야 한다.

 

📥 입력

첫째 줄에 단어의 개수 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. 길이가 같을 경우에만 사전 순으로 정렬
반응형