백준 10989번 기수 정렬 사용

veloger·2022년 11월 22일
0

Arrays.sort를 사용하면 간단하게 해결할 수 있는 문제 이지만 기수 정렬을 사용하여 풀어보았습니다.

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;

public class Q22p138 {

public static void main(String[] args) throws NumberFormatException, IOException {
	// TODO Auto-generated method stub
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	int num = Integer.parseInt(br.readLine());
	int[] arr = new int[num];
	int[] sortArr = new int[num];
	for (int i = 0; i < num; i++) {
		arr[i] = Integer.parseInt(br.readLine());
	}

	br.close();

	sortArr = sort(arr, arr.length);

	for (int i = 0; i < arr.length; i++) {
		System.out.println(sortArr[i]);
	}

}

public static int[] sort(int[] arr, int len) {
	Queue<Integer>[] qu = new LinkedList[10];
	int div = 1;
	int maxLen = maxCount(arr);

	for (int i = 0; i < 10; i++) {
		qu[i] = new LinkedList<>();
	}

	for (int m = 0; m < maxLen; m++) {
		for (int i = 0; i < len; i++) {
			qu[(arr[i] / div) % 10].add(arr[i]);
		}

		for (int i = 0, j = 0; i < 10; ++i) {
			while (!qu[i].isEmpty()) {
				arr[j++] = qu[i].poll();
			}
		}
		div *= 10;
	}
	return arr;

}

private static int digitCount(int num) {
	if (num == 0) {
		return 1;
	}

	return (int) Math.floor(Math.log10(Math.abs(num))) + 1;
}

private static int maxCount(int[] arr) {
	int max = 0;

	for (int i = 0; i < arr.length; i++) {
		if (max < digitCount(arr[i]))
			max = digitCount(arr[i]);
	}

	return max;
}

}

0개의 댓글