단어 정렬

23 June 2019

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

이번은 단어를 기준에 따라 정렬하는 문제를 풀어보도록 하겠습니다.

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

public class Main {

    public static void main(String args[]) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));

        int size = Integer.parseInt(reader.readLine());

        String[] strArr = new String[size];

        for (int i = 0; i < size; i++) {
            String str = reader.readLine();
            strArr[i] = str;
        }

        qSort(strArr, 0, strArr.length - 1);

        String prev = null;
        for (int i = 0; i < size; i++) {
            if (!strArr[i].equals(prev)) {
                writer.write(strArr[i] + "\n");
                prev = strArr[i];
            }
        }

        writer.flush();
        writer.close();
        reader.close();

    }

    private static void qSort(String[] arr, int start, int end) {
        if (start < end) {

            int partition = getPartition(arr, start, end);

            qSort(arr, start, partition - 1);
            qSort(arr, partition + 1, end);
        }
    }

    private static int getPartition(String[] arr, int start, int end) {
        String pivot = arr[end];
        int i = start - 1;
        for (int k = start; k < end; k++) {
            if (isLowValue(arr[k], pivot)) {
                i++;
                String temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;
            }
        }

        String temp = arr[i + 1];
        arr[i + 1] = arr[end];
        arr[end] = temp;

        return i + 1;
    }

    private static boolean isLowValue(String s, String pivot) {
        
        if (s.equals(pivot)) {
            return false;
        }
        if (s.length() < pivot.length()) {
            return true;
        } else if (s.length() == pivot.length()) {
            for (int i = 0; i < pivot.length(); i++) {
                if (pivot.charAt(i) > s.charAt(i)) {
                    return true;
                } else if (pivot.charAt(i) < s.charAt(i)) {
                    return false;
                }
            }
        }

        return false;
    }
}
이번 문제는 quick sort를 이용해 풀어주도록 합니다.
quick sort에서 정렬을 할 때 isLowValue 메서드를 만들어 같은 string일 경우는 false, 길이가 짧을 때는 true, 같은 길이일 때 알파벳순이 이전이면 true를 return해주도록 합니다.
출력시에는 중복된 값의 경우에는 출력을 skip하도록 합니다.