PS/BOJ

백준 10989 수 정렬하기 3

_룰루 2021. 7. 12. 15:57
 

10989번: 수 정렬하기 3

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

www.acmicpc.net

 

수 정렬하기 1,2와 같은 문제지만 시간 제한 + 메모리 제한이 있다

여기서 제일 중요한게 메모리 제한임

그래서 구글링으로 카운팅 정렬을 이용해야한다 함

카운팅 정렬을 간단하게 정리하자면 어떤 데이터들이 들어있는 배열들이 있는데 각 배열의 요소들이 등장할 경우 그 요소들의 위치에 맞는 count 배열에 요소의 수만큼 카운트해서 count 배열에 저장함. 그리고 나서 count 배열에 존재하는 요소의 수만큼 인덱스를 출력해주면 됨

 

1. 수 정렬하기 2 코드를 그대로 붙여넣으니 메모리 초과로 실패❌

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        ArrayList<Integer> list = new ArrayList<Integer>();
        StringBuilder sb = new StringBuilder();


        int num = Integer.parseInt(br.readLine());

        for(int i=0; i<num; i++){
            list.add(Integer.parseInt(br.readLine()));
        }

        Collections.sort(list);

        for(Integer i:list){
            sb.append(i).append('\n');
        }
        System.out.println(sb);
    }
}

 

2. 리스트를 배열로 바꾸고 카운트 해주는 것으로 변경

하지만 배열인덱스를 넘어가버려서 런타임 에러(ArraryIndexOutOfBounds)로 실패❌

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;

class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int num = Integer.parseInt(br.readLine());
        int[] count = new int[10001];

        //각 원소 갯수 저장함
        for(int i=0; i<num; i++) {
            int input = Integer.parseInt(br.readLine());
            count[input]++;
        } //여기까지 오케이

        //존재하는 원소의 수만큼 i를 출력한다.
        for(int i=1; i<=count.length; i++){
            for(int k=0; k<count[i]; k++) {
                sb.append(i).append('\n');
            }
        }
        System.out.println(sb);
    }
}

 

3. 배열 인덱스를 넘지 않기 위해 각 배열안의 요소가 1개 이상일 때만 출력해주니까 성공!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;

class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int num = Integer.parseInt(br.readLine());
        int[] count = new int[10001];

        //각 원소 갯수 저장함
        for(int i=0; i<num; i++) {
            int input = Integer.parseInt(br.readLine());
            count[input]++;
        } //여기까지 오케이

        //존재하는 원소의 수만큼 i를 출력한다.
        for(int i=1; i<=10000; i++){
            if(count[i]>0) {
                for (int k = 0; k < count[i]; k++) {
                    sb.append(i).append('\n');
                }
            }
        }
        System.out.println(sb);
    }
}
반응형