● 백준 단계별 풀어보기
: 2019.02.11 ~ 2019.02.17 기간동안 단계별 풀어보기를 진행하고 그 중 '수정렬하기-3'를 정리한다.
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
예제 입력 1
10 5 2 3 1 4 2 3 5 1 7
예제 출력 1
1 1 2 2 3 3 4 5 5 7
* 해당 문제는 counting sort 를 이용해서 문제를 해결했다.
** counting sort
배열 N : [5,2,3,1,4,2,3,5,1,7];
카운드 : [0,2,2,2,1,2,0,1]
누적 : [0,2,4,6,7,9,9,10] << 해당 누적값은 정렬시 위치를 찾는 역할을 한다.
즉, 0 번은 0번부터 0번에 위치
1은 0 부터 2 사이에 위치
2는 2 부터 4 사이에 위치 ....
정렬 N : [1,1,2,2,3,3,4,5,5,7]
참고 : https://yaboong.github.io/algorithms/2018/03/20/counting-sort/
import java.io.OutputStreamWriter;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t_case = Integer.parseInt(br.readLine());
int[] sort = new int[t_case];
for(int i = 0 ; i < t_case ; i++) {
sort[i] = Integer.parseInt(br.readLine());
}
sort = countSorting(sort);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int j = 0 ; j < sort.length ; j++) {
bw.write(Integer.toString(sort[j])+"\n");
}
br.close();
bw.close();
}
// couning sort
public static int[] countSorting(int[] sort) {
int max = 0;
for(int i = 0 ; i < sort.length ; i++) {
if(max < sort[i]) max = sort[i];
}
int[] result = new int[sort.length]; // 정렬 후 배열
int[] temp = new int[max+1]; // 누적값을 위한 배열
for(int j = 0 ; j < sort.length ; j++) { // 기존 배열 카운팅
temp[sort[j]]++;
}
for(int k = 1 ; k <temp.length; k++) { // 누적값 입력
temp[k] += temp[k-1];
}
for(int q = sort.length-1 ; q>=0 ; q--) {
result[--temp[sort[q]]]= sort[q];
}
return result;
}
}
'백준 알고리즘' 카테고리의 다른 글
2019.02.25 ~ 2019.03.31 (0) | 2019.03.31 |
---|