CodingTEST

[백준 1181] 단어 정렬 (JAVA)

경걍 2023. 11. 30. 03:12
반응형

백준 1181번 문제 - 단어 정렬

 

1181번: 단어 정렬

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

www.acmicpc.net


문제 분석

 

 

 

  • 알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
    • 길이가 짧은 것부터
    • 길이가 같으면 사전 순으로 (단, 중복된 단어는 하나만 남기고 제거해야 한다.)

해결 키 포인트

 

  • 단어(String s)와 단어 길이를 담은 클래스(Word) 생성
  • 중복된 단어는 하나만 출력하기 위해 TreeSet 사용
  • 클래스가 implements Comparable<Word> 하도록 한다.
    • 정렬 방법: 길이가 짧은 것부터, 길이가 동일할 경우 compareTo()로 사전 순으로

코드

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());

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

        for(Word w : words) {
            bw.write(w.s + "\n");
        }

        bw.flush();
        bw.close();
    }

    public static class Word implements Comparable<Word> {
        String s;
        int len;

        public Word(String s) {
            this.s = s;
            len = s.length();
        }

        @Override
        public int compareTo(Word o) {
            if(len == o.len) {
                return s.compareTo(o.s);
            }
            return  len - o.len;
        }
    }

}
반응형