본문 바로가기

[BOJ] - JAVA

[백준] 10989 : 수 정렬하기 3 JAVA 풀이

카운팅정렬을 구현하는 방법은 다음과 같다.

 

1. 입력받을 숫자의 개수를 N이라고 했을 때,

   그 숫자들을 저장할 배열 arr[N]와 정렬된 값을 저장할 result[N]을 생성한다.

 

2. arr에 저장된 숫자들의 출현빈도를 저장할 배열을 생성하는데

   이때 그 배열의 크기는 입력되는 숫자의 범위로 한다.

   그 범위를 10000이하의 자연수라고 하면 count[10001]을 생성한다.

 

3. arr를 순회하면서 arr에 저장된 숫자의 출현빈도를

   count의 그 숫자를 인덱스로 하는 곳에 저장한다.

   count[arr[i]]++;

 

4. count 배열을 누적합으로 바꾼다.

   i=1부터 count.length-1까지 count[i] = count[i] + count[i-1];

   이를 수행하고 난 뒤의 count[0]이 3이고 count[1]이 4라면 count[2]는 7이다.

   이 값들은 arr배열에 0이 3개, 1이 1개 저장되어 있음을 의미한다.

   다시 말하면 배열의 인덱스는 0부터 시작하니

   count배열에 저장된 값-1은 정렬된 후 count배열의 인덱스값이 위치해야 할 자리가 된다.

 

5. result 배열에 정렬된 값을 저장한다.

   int val = arr[i];

   count[val]--; // count배열에 저장된 값-1

   result[count[val]] = val; 

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];
        // 입력되는 수는 1~10000이니 count[1]부터 count[10001]까지 필요
        int[] count = new int[10001];
        int[] result = new int[N];
        
        for(int i=0;i<N;i++){
            arr[i] = Integer.parseInt(br.readLine());
        }
        
        for(int i=0;i<arr.length;i++){
            count[arr[i]]++;
        }
        
        for(int i=1;i<count.length;i++){
            count[i] += count[i-1];
        }
        
        for(int i=arr.length-1;i>=0;i--){
            int val = arr[i];
            count[val]--;
            result[count[val]] = val;
        }
        
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<result.length;i++){
            sb.append(result[i]).append('\n');
        }
        System.out.print(sb);
        
    }
}

딱 카운팅정렬의 정석대로 풀었는데 정렬된 값을 출력할 때

for(int val : result) System.out.println(val);

이렇게 했더니 시간초과가 나와서 스트링빌더로 바꿨더니 정답처리가 됐다.

 

https://st-lab.tistory.com/104

 

자바 [JAVA] - 카운팅 정렬 (Counting Sort / 계수 정렬)

[정렬 알고리즘 모음] 더보기 1. 계수 정렬 (Counting Sort) - [현재 페이지] 2. 선택 정렬 (Selection Sort) 3. 삽입 정렬 (Insertion Sort) 4. 거품 정렬 (Bubble Sort) 5. 셸 정렬 (Shell Sort) 6. 힙 정렬 (H..

st-lab.tistory.com

카운팅정렬 구현은 이 포스트를 참고했다!