백준 1181 : 단어 정렬

2023. 9. 1. 17:37ETC/Algorithm

문제

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

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

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

 

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        Main main = new Main();
        Scanner sc = new Scanner(System.in);
        int length = sc.nextInt();
        sc.nextLine();
        String[] words = new String[length];
        for (int i = 0; i < length; i++) {
            words[i] = sc.nextLine();
        }
        String[] answer = main.solution(length, words);
        for (String word : answer) {
            System.out.println(word);
        }
    }

    private String[] solution(int length, String[] words) {
        Set<String> unique = new HashSet<>(Arrays.asList(words));
        String[] answer = unique.toArray(new String[0]);
        Arrays.sort(answer, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1.length() - o2.length() == 0) {
                    return o1.compareTo(o2); // java의 문자열 비교 방식이 사전식 비교 방식이기 때문
                } else {
                    return o1.length() - o2.length();
                }
            }
        });
        return answer;
    }
}

 

도저히 풀 방법이 생각나지 않아서 구글링 하였다.

코드가 깨끗해 보이지는 않지만,, 우선 Comparator에 대해서 알게 되었다.

 

Arrays.sort 메소드에서는 인자로 배열과 Comparator를 받는다.

Comparator는 interface인데 정렬에 많이 쓰인다고 한다.

 

두 가지 인자를 비교한다. 음의 정수, 0 혹은 양의 정수를 return 하는데

음의 정수 -> 첫 번째 인자가 더 작음

0 -> 두 인자가 같음

양의 정수 -> 두 번째 인자가 더 큼

 

Arrays.sort(answer, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        if (o1.length() - o2.length() == 0) {
            return o1.compareTo(o2); // java의 문자열 비교 방식이 사전식 비교 방식이기 때문
        } else {
            return o1.length() - o2.length();
        }
    }
});

sort 함수 내부에서 Comparator의 compare 함수를 override 하여 비교 방식을 재정의 하였다.

o1과 o2의 길이가 같으면 compareTo 메소드를 이용하여 사전식 비교를 하며

길이가 다르다면 인자의 길이(length) 비교를 통해 두 인자를 비교한다.

 

private String[] solution(int length, String[] words) {
    Set<String> unique = new HashSet<>(Arrays.asList(words));
    String[] answer = unique.toArray(new String[0]);
    Arrays.sort(answer, (o1, o2) -> {
        if (o1.length() - o2.length() == 0) {
            return o1.compareTo(o2); // java의 문자열 비교 방식이 사전식 비교 방식이기 때문
        } else {
            return o1.length() - o2.length();
        }
    });
    return answer;
}

람다를 이용하여 위와 같이 코드를 바꿔줄 수도 있다.