본문 바로가기

Java/백준

[JAVA] 백준 10898 수 정렬하기 3

10989번: 수 정렬하기 3 (acmicpc.net)

 

10989번: 수 정렬하기 3

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

www.acmicpc.net

 

풀이 과정 

 

- 도수 정렬(counting sort) 이용 

 

- 도수 정렬은 데이터를 비교, 교환하는 작업이 필요 없어 매우 빠름

- 다중 for문이 아닌 단순 for문만을 사용하고, 재귀 호출과 2중 for문이 없으므로 아주 효율적인 알고리즘

- 하지만 도수 분포표가 필요하기 때문에 데이터의 최솟값과 최댓값을 미리 알고 있는 경우에만 사용 가능 

2023.08.01 - [C언어/자료구조] - 6-9장 도수 정렬

 

6-9장 도수 정렬

1. 도수 정렬하기 도수 정렬 (counting sort) - 요소의 대소 관계를 판단하지 않고 빠르게 정렬 - 데이터의 최솟값과 최댓값을 미리 알고 있는 경우에만 사용 가능 1) 도수 분포표 만들기 2) 누적도수분

juju-study.tistory.com

 

 

정답

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

public class Main {
    //카운팅 정렬
    static void countingSort(int[] a, int n, int max)
    {
        int f[] = new int[max+1]; //누적 도수 
        int b[] = new int[n]; //작업용 목표 배열 
        
        for(int i=0; i<n; i++)
        {
             f[a[i]]++;
        }
        for(int i=1; i<=max; i++)
        {
             f[i]+=f[i-1];  
        }
        for(int i=n-1; i>=0; i--)
        {
            b[--f[a[i]]] = a[i];
        }
        for(int i=0; i<n; i++)
        {
            a[i]=b[i];
        }
    }
    
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int num = Integer.parseInt(br.readLine());
        int n[] = new int[num];
        
        for(int i=0; i<num; i++)
        {
            n[i] = Integer.parseInt(br.readLine());
        }
        
        int max = n[0];
        for(int i=1; i<num; i++)
        {
            if(n[i]>max)
                max=n[i];
        }
      
        countingSort(n,num,max);
        
        for(int i=0; i<num; i++)
        {
            bw.write(Integer.toString(n[i])+"\n");
        }
        
        bw.flush();
        bw.close();

    }
}

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

[JAVA] 백준 11650 좌표 정렬하기  (1) 2024.02.07
[JAVA] 백준 1427 소트인사이드  (0) 2024.02.07
[JAVA] 백준 2751 수 정렬하기 2  (1) 2024.02.06
[JAVA] 백준 25305 커트라인  (0) 2024.02.06
[JAVA] 백준 2587 대표값2  (1) 2024.02.06