Algorithm/Algorithm 문제

백준_10989 수 정렬하기3 (기수정렬) - 성공(풀이 참고)

kjyyjk 2024. 1. 18. 13:12

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BJ_10989 {

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int i, n;
        n = Integer.parseInt(br.readLine());

        int[] arr = new int[n];

        for(i=0; i<n; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }

        radixSort(arr, 5);

        StringBuilder sb = new StringBuilder();
        for(i=0; i<n; i++) {
            sb.append(arr[i]).append('\n');
        }

        System.out.println(sb);
    }

    static void radixSort(int[] arr, int max) {
        int i, j, k;
        int[] output = new int[arr.length];
        int[] bucket;

        k=1;
        for(i=0; i<max; i++) { //각 자릿수
            bucket = new int[10]; //각 자릿수의 분포(0~9)를 담을 bucket
            for(j=0; j<arr.length; j++) {
                bucket[(arr[j]/k)%10]++; //각 자릿수 분포 담기
            }

            for(j=1; j<10; j++) {
                bucket[j] += bucket[j-1]; //bucket을 구간합배열로
            }

            for(j=arr.length-1 ; j>=0; j--) { //뒤에서부터. 10의 자리부터는 앞 자리들을 기준으로 오름차순 되어있기 때문
                output[bucket[(arr[j]/k)%10]-1] = arr[j]; //bucket의 해당 자릿수 값이 n이면, 그 수는 n번째수. 인덱스로는 n-1.
                bucket[(arr[j]/k)%10]--; //자릿수의 값이 같은 다른 수를 고려하여 -1. 해당 자릿수가 같아도 앞자릿수가 더 큰 수가 먼저 뒤로 들어감
            }

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

            k*=10; //자릿수 증가
        }
    }
}

 

 

전혀 생각지도 못했던 방식이다

배열 3개만 사용하니 메모리 통과.

당장은 이해했는데 다른 문제를 보고 비슷한 방식을 떠올릴 수 있을지는..

이런게 쌓이다보면 요령도 늘겠지라는 생각

 

 

10989번: 수 정렬하기 3

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

www.acmicpc.net