본문 바로가기

Algorithm/BOJ

[BOJ-1181][문자열] 단어 정렬 - Java

문제 바로가기

 

1181번: 단어 정렬

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

www.acmicpc.net

중복 제거후, 단어의 길이로 먼저 정렬을 하고, 단어 길이가 같은 경우에는 사전순으로 정렬을 하면 되는 문제입니다. 자바로 custom하게 어떻게 정렬하는지 한참 찾아보고 풀었습니다.

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

class sortByValueFirst implements Comparator<String>{
    @Override
    public int compare(String o1, String o2) {
        if(o1.length() > o2.length()) return 1;
        else if(o1.length() < o2.length()) return -1;
        else return o1.compareTo(o2);
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        HashSet<String> words = new HashSet<>();

        for (int i = 0; i < n; i++)
            words.add(input.next());

        ArrayList<String> list = new ArrayList<>(words);
        Collections.sort(list, new sortByValueFirst());

        for (String s : list)
            System.out.println(s);
    }
}

우선 중복을 제거해야 하기 때문에 받는 입력을 HashMap 에 넣어서 중복 단어를 제거해줬습니다. 그러고 얘를 ArrayList에 넣어주고, 요 놈을 정렬했슴니다

ArrayListCollections.sort()를 통해서 정렬이 가능합니다. 이 때 Collections.sort() 함수는 두 가지 형태에 대해서 오버라이딩이 되어 있습니다.
첫 번째 함수 형태는 하나의 인자 정보를 넘겨주는 형태로 ArrayList 객체를 넘겨줍니다. 이때 ArrayList에 담기는 요소의 Type 클래스에서 Comparable 인터페이스를 구현하여 compareTo() 함수를 오버라이딩 해주어야 합니다.
두 번째 함수 형태는 첫 번째 인자를 ArrayList 객체를 넘겨주게 되고 두 번째 인자는 Comparator 인터페이스를 implements한 후 compare() 함수를 오버라이딩한 구현체를 넘겨주게 됩니다.

Comparator Interface의 compare() 작성법

  • 첫 번째 파라미터로 넘어온 객체 < 두 번째 파라미터로 넘어온 객체: 음수 리턴

  • 첫 번째 파라미터로 넘어온 객체 == 두 번째 파라미터로 넘어온 객체: 0 리턴

  • 첫 번째 파라미터로 넘어온 객체 > 두 번째 파라미터로 넘어온 객체: 양수 리턴

  • 음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 변경됩니다. 즉, Integer.compare(x, y)(오름차순 정렬)와 동일한 개념입니다.

단어들의 길이가 다를 때 길이를 보고 정렬을 하고, 같을 때는 단어를 보고 정렬을 해주면 됩니다.

 

감사합ㄴㅣ다