Study/Baekjoon

Baekjoon10989: 수 정렬하기 3, 카운팅 정렬

devyoseph 2021. 11. 4. 22:32

수 정렬하기 3

시간 제한메모리 제한제출정답맞은 사람정답 비율

5 초 (하단 참고) 8 MB (하단 참고) 129846 29380 21612 23.384%

문제

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

입력

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

출력

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

 

풀이1

이전 단계 문제에서 사용한 Arrays.sort를 이용해도 풀이가 되는 것을 확인할 수 있다

import java.io.*;
import java.util.Arrays;
public class Main {
	static int[] arr;
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 N = Integer.parseInt(br.readLine());
	 int[] arr = new int[N];
	 for(int i=0; i<N;i++)arr[i]=Integer.parseInt(br.readLine());
	 Arrays.sort(arr);
	 for(int i=0; i<N;i++)bw.write(arr[i]+"\n");
	 bw.flush();
	 bw.close();
}}

*메모리 사용 약 340,000 KB

풀이2

문제가 의도한 카운팅(계수) 정렬을 사용해 풀이한다. 수의 크기가 10,000보다 작거나 같기 때문에 10001 크기의 배열을 만든다.

카운팅 배열은 각 index에 해당하는 숫자를 세어준 뒤 누적합 배열로 만들어줘야 한다. 하지만 그것은 정렬된 배열을 만드는 경우며 이 문제에서는 위치 상관없이 곧바로 출력하기만 하면 되므로 값을 바로 기록하고 카운팅 배열에 기록된 수만큼 출력하기만 하면 된다.

import java.io.*;
public class Main {
	static int[] arr;
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[] counting = new int[10001]; //카운팅 배열을 만들어준다
	 int N = Integer.parseInt(br.readLine());
	 
     while(N-->0) {
		counting[Integer.parseInt(br.readLine())]++; //배열 안에 값을 넣어주면서 세어준다
	 }
     
	 for(int i=0; i<10001; i++) {  //기록된 수만큼 index를 호출한다
		for(int j=0; j<counting[i]; j++) {
			bw.write(i+"\n");
		}
	 }
     
	 bw.flush();
	 bw.close();
}}

*조금이지만 메모리 부분이 개선되었다