기록하는 개발자

[백준][JAVA] 10989: 수 정렬하기3 본문

Algorithm

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

밍맹030 2021. 8. 9. 16:44
728x90

https://www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

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

www.acmicpc.net

 

  시간제한 메모리제한 주어진 수의 개수
2750번 수 정렬하기 1초 128MB 1000개
2751번 수 정렬하기2 2초 256MB 1,000,000개
10989번 수 정렬하기3 3초 8MB 10,000,000개

표와 같이 2750번, 2751번 보다 10989번에서 주어지는 수의 개수가 훨씬 많다.

앞선 두 문제는 BufferedReader, Collections.sort(), StringBuilder를 사용한 동일한 코드로 통과가 가능했지만

10989번 문제에서는 8MB라는 빡빡한 메모리 제한이 있어 첫 시도에 시간 초과가 아닌 메모리초과가 발생했다.

 

2021.08.09 - [Algorithm] - [백준][JAVA] 2750: 수 정렬하기

 

[백준][JAVA] 2750: 수 정렬하기

https://www.acmicpc.net/problem/2750 2750번: 수 정렬하기 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수..

mingmeng030.tistory.com

 

2021.08.09 - [Algorithm] - [백준][JAVA] 2751: 수 정렬하기2

 

[백준][JAVA] 2751: 수 정렬하기2

https://www.acmicpc.net/problem/2751 2751번: 수 정렬하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은..

mingmeng030.tistory.com

 

방법은 sort 함수 대신 Counting Sort를 사용하는 것이다.

Array.sort 또는 Collection.sort 다 O(N^2)인 반면,

Counting Sort는 O(N+K)로 데이터가 많을수록 O(N)에 가까운 시간복잡도를 가져 비교적 매우 빠르다.

 

Counting Sort 참고 블로그 : 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

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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++) 
            count[Integer.parseInt(br.readLine())] ++;
         
        for(int i = 1; i < 10001; i++){
            while(count[i] > 0){
                sb.append(i).append('\n');
                count[i]--;
            }
        }
        System.out.println(sb);
        br.close();
    }
}

 

728x90