Algorithm/Baekjoon Oline Judge - Java
[백준] 10989_수정렬하기3 / 카운팅 정렬
StrongMin
2024. 6. 8. 19:39
Bronze
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
풀이
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[] count = new int[10001];
// 카운팅 정렬
for(int i=0; i<N; i++){
int index = Integer.parseInt(br.readLine());
count[index] += 1;
}
for(int i=0; i<count.length; i++){
while(count[i]>0){
sb.append(i).append("\n");
count[i]--;
}
}
System.out.print(sb);
br.close();
}
}
카운팅 정렬
각 값의 빈도를 계산하여 카운팅 배열에 저장한 후, 누적 빈도를 통해 배열을 정렬한다.
데이터의 범위가 작을 때 매우 빠르고 메모리 효율적인 정렬 방법이다.
[4, 2, 2, 8, 3, 3, 1]
=> 카운팅 배열 : [0, 1, 2, 2, 1, 0, 0, 0, 1]
=> 누적 배열 : [0, 1, 3, 5, 6, 6, 6, 6, 7]
=> 정렬된 배열 : [1, 2, 2, 3, 3, 4, 8]
- 최대 값 찾기: 입력 배열에서 가장 큰 값을 찾는다. 이는 카운팅 배열의 크기를 결정하는 데 필요하다.
- 카운팅 배열 생성: 각 값의 빈도를 저장할 카운팅 배열을 생성한다. (최댓값+1)
- 빈도 계산: 입력 배열을 순회하며 각 값의 빈도를 카운팅 배열에 저장한다.
- 누적 빈도 계산: 각 값을 누적하여 각 값이 정렬된 배열에서 위치할 인덱스를 계산한다.
- 정렬된 배열 생성: 입력 배열을 순회하며 누적배열을 통해 정렬된 배열을 생성한다.
https://www.acmicpc.net/problem/10989