본문 바로가기
Algorithm/백준 알고리즘

[백준 알고리즘 / JAVA] 1181번 단어 정렬

by newtownboy 2024. 1. 6.


문제 정보

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net


코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int numWords = Integer.parseInt(reader.readLine());
        List<String> wordList = new ArrayList<>();

        // 단어 입력과 중복 제거
        for (int i = 0; i < numWords; i++) {
            String word = reader.readLine();

            // 중복 확인 후 추가
            if (!wordList.contains(word)) {
                wordList.add(word);
            }
        }

        // 단어 정렬 Comparator 구현
        Comparator<String> wordComparator = new Comparator<String>() {
            @Override
            public int compare(String first, String second) {
                if (first.length() > second.length()) {
                    return 1; // 첫 번째 단어가 길이가 더 길면 1 반환
                } else if (first.length() == second.length()) {
                    return first.compareTo(second); // 길이가 같으면 사전순으로 비교
                }
                return -1; // 첫 번째 단어가 길이가 더 짧으면 -1 반환
            }
        };

        // 단어 정렬 및 출력
        Collections.sort(wordList, wordComparator);
        for (int i = 0; i < wordList.size(); i++) {
            System.out.println(wordList.get(i));
        }
    }
}

풀이

Step1: Comparator를 사용하여 비교 알고리즘 정의

// 단어 정렬 Comparator 구현
Comparator<String> wordComparator = new Comparator<String>() {
    @Override
    public int compare(String first, String second) {
        if (first.length() > second.length()) {
            return 1; // 첫 번째 단어가 길이가 더 길면 1 반환
        } else if (first.length() == second.length()) {
            return first.compareTo(second); // 길이가 같으면 사전순으로 비교
        }
        return -1; // 첫 번째 단어가 길이가 더 짧으면 -1 반환
    }
};
  • "Comparator" 인터페이스를 구현하여 두 문자열을 비교합니다. 비교하는 로직은 첫 번째로 길이가 긴 순서로 정렬을 하고, 길이가 같으면 사전순으로 정렬합니다.
  • 양수를 반환할 경우 첫 번째 객체가 두 번째 객체보다 크다는 것을 의미합니다.
  • 음수를 반환할 경우 첫 번째 객체가 두 번째 객체보다 작다는 것을 의미합니다.
  • 0을 반환할 경우 두 객체가 동일하다는 것을 의미합니다.