안녕하세요! 오늘은 백준 2751번 문제 풀이를 공유해 볼께요. 이 문제는 주어진 정수들을 오름차순으로 정렬하는 간단한 문제지만, 데이터의 크기가 커질 수 있기 때문에 성능을 고려해야 해요. 그럼 어떻게 해결했는지 코드와 함께 하나씩 알아보도록 해요!
1. 문제 이해하기
문제 내용
이 문제는 다음과 같은 작업을 요구해요:
- N개의 정수를 입력받아서
- 이를 오름차순으로 정렬한 뒤
- 한 줄에 하나씩 출력하기
입력과 출력 조건
- 입력:
- 첫 번째 줄에 숫자의 개수 N이 주어져요 (1 ≤ N ≤ 1,000,000).
- 두 번째 줄부터 N개의 정수가 한 줄에 하나씩 주어져요. (각 정수는 -1,000,000부터 1,000,000 사이)
- 출력:
- 정렬된 정수들을 한 줄에 하나씩 출력해요.
제약 조건
- N이 최대 1,000,000까지 갈 수 있어서 효율적인 정렬 알고리즘이 필요해요.
- 입력 데이터가 많기 때문에 빠르게 입력받고 출력하는 방법도 중요해요.
2. 문제 해결 방법
핵심 포인트
1) 정렬 알고리즘 선택
C++에서는 STL의 sort 함수를 사용하는 게 가장 간단하고 효율적이에요. 이 함수는 O(NlogN) 복잡도를 가지고 있어서 대규모 데이터도 처리할 수 있어요.
2) 빠른 입출력 처리
많은 데이터를 다루다 보면 입출력 속도가 걸림돌이 될 수 있어요. 그래서 cin.tie(NULL)와 ios::sync_with_stdio(false)를 사용해 입출력 속도를 높이는 게 중요해요.
3) STL vector 활용
데이터를 저장하고 다루기 위해 C++의 동적 배열인 벡터를 사용할 거예요. 벡터는 데이터 크기가 유동적인 상황에서 유용해요.
3. 코드와 풀이
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
int N; cin >> N;
vector<int> vec(N);
for (int &x: vec) {
cin >> x;
}
sort(vec.begin(), vec.end());
for (int x: vec) {
cout << x << '\n';
}
return 0;
}
코드 설명
1) 입력 속도 높이기
cin.tie(NULL);
ios::sync_with_stdio(false);
이 두 줄은 입출력 속도를 높여줘요. cin과 cout을 묶어두는 걸 풀어서 독립적으로 동작하게 만들고, C++ 입출력을 C 스타일 입출력과 분리해 성능을 높이는 거예요. 데이터가 많을 땐 필수로 써주는 게 좋아요!
2) 벡터에 데이터 저장
vector<int> vec(N);
for (int &x: vec) {
cin >> x;
}
vector<int>는 N개의 데이터를 담을 수 있는 동적 배열이에요. for (int &x : vec)를 통해 간단하게 데이터를 입력받을 수 있어요.
3) STL sort 함수로 정렬
sort(vec.begin(), vec.end());
STL에서 제공하는 sort 함수는 매우 빠르고 간단해요. vec.begin()부터 vec.end()까지 데이터를 오름차순으로 정렬해줘요.
4) 결과 출력
for (int x : vec) {
cout << x << '\n';
}
정렬된 데이터를 한 줄에 하나씩 출력해요. \n을 사용해서 줄바꿈을 처리했는데, endl보다 빠르게 출력할 수 있어요.
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 백준 1003번 - 다이나믹 프로그래밍 (0) | 2025.01.06 |
---|---|
[C++] 백준 9095번 - 다이나믹 프로그래밍 (0) | 2025.01.04 |
[C++] 백준 11725번 - 그래프와 STL을 사용한 풀이 (0) | 2024.12.31 |
[C++] 백준 2798번 - 기본 풀이와 분할정복 시도 2가지 풀이 (0) | 2024.12.26 |
[C/C++] 백준 2839번: 설탕 배달 (1) | 2024.12.21 |