Algorithms 🚀/Baekjoon

[백준/1181번] 단어 정렬 - JAVA[자바]

728x90

www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

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

www.acmicpc.net

어제 푼 문제보다 조금 더 난이도가 있는 문제입니다. 그래도 쉬운 문제에 속한다고 생각합니다.

 

포기하지 말고 답을 보기 전에 조금 더 생각해보시는 걸 추천드립니다!!

 

이 문제의 조건은 3가지입니다.

 

1. 길이가 짧은 단어를 오름차순으로 정렬

2. 길이가 같으면 사전 순으로 정렬

3. 중복되는 단어는 1번만 출력

 

아마도 막힌다면 중복 단어를 제거하는 부분에서 막힐 거라고 생각합니다.

 

하지만 자바에서는 정말 간단한 방법으로 중복 단어를 제거할 수 있습니다!! 바로 Set을 이용한 방법입니다!

 

Set은 중복 값을 허용하지 않기 때문에 자동으로 3번 조건을 충족시킬 수 있습니다.

 

주의할 점은 Set은 sort를 이용해서 정렬할 수 없기 때문에 List에 Set 값을 넣고 정렬해주어야 합니다.

 

그다음은 Comparator를 구현해서 정렬해주면 손쉽게 정렬할 수 있습니다 ㅎㅎ

 

아래는 정답 코드입니다. (답을 먼저 보지 말고 차분히 생각해보고 봐주세요!!)

더보기
package baekjoon.level12;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class BOJ_1181 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        Set<String> words = new HashSet<String>();

        for(int i=0; i<N; i++){
            words.add(br.readLine());
        }

        List<String> filterWord = new ArrayList<String>(words);

        filterWord.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1.length() == o2.length()) {
                    return o1.compareTo(o2);
                }
                return o1.length() - o2.length();
            }
        });

        for(String str : filterWord) {
            System.out.println(str);
        }
    }
}

 

728x90