코딩 테스트 (Java)/백준

[Silver V] 2751. 수 정렬하기 2

가지코딩 2025. 5. 1. 13:15

문제 링크


문제 설명

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

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

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


풀이

2750. 수 정렬하기 (https://gajicoding.tistory.com/263) 문제와 비슷하나,

N의 최대 개수가 1,000,000 개로, 시간을 단축하는 것이 중요한 문제이다.

 

2750 풀이를 그대로 사용하면, 시간초과 가 발생한다.

 

 

첫 번째 풀이 (335436 KB, 2504 ms)

  • StringBuilder 를 사용하여 출력 시간을 단축시켰다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();

        int N = sc.nextInt();
        
        ArrayList<Integer> list = new ArrayList<>();

        for(int i = 0; i < N; i++) {
            list.add(sc.nextInt());
        }

        Collections.sort(list);

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

 

 

두 번째 풀이 (131360 KB, 1324 ms)

  • Scanner 대신 BufferedReader 를 사용하여 입력 시간을 단축시켰다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

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());

        ArrayList<Integer> list = new ArrayList<>();

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

        Collections.sort(list);

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

 

 

세 번째 풀이 (93900 KB, 672 ms)

  • 카운팅 정렬/계수 정렬(Counting Sort) 사용
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());

        // 중복 없이 -1,000,000 ~ 1,000,000 값 입력
        boolean[] arr = new boolean[2000001];

        for (int i = 0; i < N; i++) {
            int num = Integer.parseInt(br.readLine()) + 1000000;
            arr[num] = true;
        }

        for (int i = 0; i < arr.length; i++) {
            if (arr[i]) {
                sb.append(i - 1000000).append('\n');
            }
        }

        System.out.println(sb);
    }
}

'코딩 테스트 (Java) > 백준' 카테고리의 다른 글

[Bronze II] 2751. 수 정렬하기  (1) 2025.05.01