[백준 문제 풀이] 2751번 수 정렬하기 2

Junu Kim·2025년 12월 27일
post-thumbnail

[2751] 수 정렬하기 2

난이도: ★★☆☆☆ • solved on: 2025-12-27


문제 요약

  • 문제 유형: 정렬(sort), I/O 최적화
  • 요구사항: N개의 정수를 오름차순으로 정렬해 한 줄에 하나씩 출력해야 한다.

사용 개념

  1. 자료구조

    • int[] : 입력 수 저장
    • StringBuilder : 출력 버퍼링
  2. 알고리즘/기법

    • Arrays.sort(int[]) : 정렬
    • 출력 최적화: 개별 출력 대신 문자열 누적 후 1회 출력
  3. 핵심 키워드

    • 정렬 시간 복잡도 O(N log N)
    • I/O 병목(I/O bottleneck), 버퍼링(buffering)

풀이 아이디어

  1. 문제 분해
  • 입력이 많으므로 BufferedReader로 읽는다.
  • int[]에 저장 후 Arrays.sort()로 정렬한다.
  • 출력이 병목이 될 수 있으므로 StringBuilder에 누적 후 한 번에 출력한다.
  1. 핵심 로직 흐름

    read N
    for i in 0..N-1:
        arr[i] = read int
    sort(arr)
    sb = ""
    for each x in arr:
        sb += x + "\n"
    print(sb)
  2. 예외 처리

    • 별도 예외 케이스는 없고, 시간 초과 방지를 위해 출력 방식이 핵심이다.

코드

import java.util.*;
import java.io.*;

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];

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

        Arrays.sort(arr);

        StringBuilder sb = new StringBuilder();
        for (int num : arr) {
            sb.append(num).append("\n");
        }

        System.out.print(sb);
    }
}

시간·공간 복잡도

  • 시간 복잡도: 정렬 O(N log N) + 출력 O(N)
  • 공간 복잡도: O(N) (배열 + 출력 버퍼)

어려웠던 점

  • Arrays.sort() 자체는 O(N log N)인데도 시간 초과가 발생해서 원인을 정렬로 오해했다.
  • 실제 병목은 System.out.println()을 N번 호출하는 출력(I/O) 이었고, StringBuilder로 누적 후 한 번에 출력하니 해결되었다.

배운 점 및 팁

  • 입력이 크면, 알고리즘 시간 복잡도만 맞춰도 부족하고 I/O 최적화가 통과/실패를 결정할 수 있다.

  • 자바에서는 보통:

    • 입력: BufferedReader
    • 출력: StringBuilder + System.out.print
      조합이 안전하다.

참고 및 링크


추가 연습 문제

profile
생각이 현실이 될 수 있도록 노력하는 중입니다.

0개의 댓글