본문 바로가기
백준

[10989] 수 정렬하기 3 (JAVA)

by 댈팽이 2024. 3. 28.
728x90

# 문제 설명

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.


입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.


출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

# 정답 코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(st.nextToken()); //배열의 크기

        int[] A = new int[N];
        int max = 0;

        for (int n = 0; n < N; n++) {
            st = new StringTokenizer(br.readLine());
            A[n] = Integer.parseInt(st.nextToken());

            max = Math.max(max, A[n]);
        }

        int maxLength = 0;
        while (max != 0) {
            max /= 10;
            maxLength++;
        }

        radixSort(A, maxLength);

        for (int a : A) {
            sb.append(a + "\n");
        }

        System.out.print(sb);
    }

    public static void radixSort(int[] arr, int maxLength) {
        int[] output = new int[arr.length];
        int m = 1; //자릿수

        while (maxLength != 0) {
            int[] bucket = new int[10]; //0~9

            for (int a : arr) {
                bucket[(a / m) % 10]++;
            }

            for (int i = 1; i < 10; i++) { //누적합
                bucket[i] += bucket[i-1];
            }

            for (int i = arr.length-1; i >=0; i--) {
                output[bucket[(arr[i] / m) % 10] - 1] = arr[i];
                bucket[(arr[i] / m) % 10]--;
            }

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

            m *= 10;
            maxLength--;
        }
    }
}

 

기수 정렬을 이용하여 오름차순 정렬하였다.

메모리 제한이 있어 큐를 10개 만들면 메모리 초과가 된다.

따라서 누적합을 이용하였다.

 

정렬된 배열을 임시 저장할 output을 만든다.

현재 자릿수를 기준으로 데이터들을 나누어, 추가될 bucket에 1 증가한다.

 

bucket을 누적합 배열로 만들어 값이 들어갈 인덱스를 구하기 쉽도록 한다.

 

arr 배열의 끝부분부터 0까지 1씩 감소하면서 output에 데이터를 추가한다.

해당 bucket 수는 1 감소한다.

 

기존 배열 arr에 output을 옮겨주고, 자릿수를 바꾸고 maxLength를 1 감소한다.

728x90

'백준' 카테고리의 다른 글

[11724] 연결 요소의 개수 (JAVA)  (0) 2024.03.29
[2606] 바이러스 (JAVA)  (0) 2024.03.29
[2751] 수 정렬하기 2 (JAVA)  (1) 2024.03.28
[11004] K번째 수 (JAVA)  (0) 2024.03.28
[24060] 알고리즘 수업 - 병합 정렬 1 (JAVA)  (0) 2024.03.27