728x90
[BOJ 2751] 수 정렬하기 2 - [정렬]
문제 링크
https://www.acmicpc.net/problem/2751
문제 요약
- $N$개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
- 수의 개수 $N$은 최대 1,000,000개이며, 각 수는 중복되지 않는다.
접근 방법
- 자료구조: std::vector<int> (동적 배열)
- 알고리즘: $O(N \log N)$의 성능을 보장하는 정렬 알고리즘 (std::sort)
- 핵심 아이디어:
- 데이터가 100만 개이므로 $O(N^2)$ 알고리즘(버블, 선택, 삽입 정렬)은 시간 초과가 발생한다.
- C++의 std::sort는 최악의 경우에도 $O(N \log N)$을 보장하는 Intro Sort를 사용하여 이 문제에 적합하다.
- 대량의 데이터를 출력해야 하므로 endl 대신 \n을 사용하고, 입출력 속도 향상을 위한 최적화 코드를 추가한다.
풀이 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// 입출력 속도 최적화
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
if (!(cin >> N)) return 0;
// N개의 숫자를 담을 벡터 선언 및 입력
vector<int> numbers(N);
for (int i = 0; i < N; i++) {
cin >> numbers[i];
}
// 오름차순 정렬 (Intro Sort: O(N log N))
sort(numbers.begin(), numbers.end());
// 결과 출력 (\n 사용으로 속도 확보)
for (int i = 0; i < N; i++) {
cout << numbers[i] << "\n";
}
return 0;
}
시간/공간 복잡도
- 시간 복잡도: $O(N \log N)$ (정렬 알고리즘 성능에 기인)
- 공간 복잡도: $O(N)$ (입력값 저장을 위한 벡터 크기)
실행 결과 (예상)
- 메모리: 약 12,000 KB (1,000,000 * 4 bytes + 벡터 오버헤드)
- 시간: 약 300 ~ 600 ms (정렬 및 출력 속도에 따라 변동)
핵심 포인트
- 정렬 알고리즘 선택: 시간 제한(2초) 내에 100만 개의 데이터를 처리하기 위해 효율적인 정렬(Merge, Quick, Heap) 기반의 std::sort를 사용해야 한다.
- 출력 속도: endl은 버퍼를 매번 비우기 때문에 매우 느리다. 대량 출력 시에는 반드시 \n을 사용해야 한다.
- 입출력 동기화 해제: sync_with_stdio(false)를 통해 C++ 스트림의 성능을 극대화한다.
예제 확인
- 예제 입력 1:
- 5 5 4 3 2 1
- 예제 출력 1:
- 1 2 3 4 5
728x90
'코딩테스트' 카테고리의 다른 글
| [BOJ 10989] 수 정렬하기 3 - [정렬] (0) | 2026.02.12 |
|---|---|
| [BOJ 1427] 소트인사이드 - [정렬 / 문자열] (0) | 2026.02.12 |
| [BOJ 25305] 커트라인 - [구현 / 정렬] (0) | 2026.02.06 |
| [BOJ 2587] 대표값2 - [수학, 구현, 정렬] (0) | 2026.02.06 |
| [BOJ 2750] 수 정렬하기 - [구현, 정렬] (0) | 2026.02.06 |