슬기로운 개발생활

[백준] 1181번 단어 정렬 자바(Java)

by coco3o
반응형

https://www.acmicpc.net/problem/1181

1181번: 단어 정렬

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

www.acmicpc.net


정답 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        HashSet<String> set = new HashSet<>();

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

        int size = set.size();
        String[] arr = new String[size];
        set.toArray(arr);

        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                if (s1.length() == s2.length()) {
                    return s1.compareTo(s2);
                } else {
                    return s1.length() - s2.length();
                }
            }
        });

        StringBuilder sb = new StringBuilder();
        for (String s : arr) {
            sb.append(s).append('\n');
        }
        System.out.println(sb);
    }
}

설명

Set을 사용해 중복된 단어는 애초에 저장하지 않고,
Set에 저장된 문자열들을 String 배열에 옮겨 정렬을 하는데,
Comparator를 구현하여 단어의 길이가 같을 경우 사전순으로 정렬하고, 그 외에는 단어 길이순으로 정렬해준다.
s1.length() - s2.length() 에서 양수가 반환되면 위치가 서로 바뀌게 되고, 음수가 반환되면 위치가 바뀌지 않는다.

예를들어, {2, 1, 3}의 배열이 있고 public int compare(int a1, int a2) { return a1 - a2 } 가 있다면,
a1은 2, a2는 1이 된다. 즉, 2 - 1 = 1 이므로 양수가 반환되어 a1과 a2의 위치가 바뀌게 된다. 그러면 { 1, 2, 3 }이 되겠다.그 다음 a1, a2는 각각 2와 3이 될테고, 2 - 3 = -1 이므로 음수가 반환되어 위치가 바뀌지 않는다.

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기