알고리즘/백준

[C++] 백준 2751번 - STL 활용

wenna21 2024. 12. 31. 20:22
반응형

안녕하세요! 오늘은 백준 2751번 문제 풀이를 공유해 볼께요. 이 문제는 주어진 정수들을 오름차순으로 정렬하는 간단한 문제지만, 데이터의 크기가 커질 수 있기 때문에 성능을 고려해야 해요. 그럼 어떻게 해결했는지 코드와 함께 하나씩 알아보도록 해요!

1. 문제 이해하기

문제 내용

이 문제는 다음과 같은 작업을 요구해요:

  • N개의 정수를 입력받아서
  • 이를 오름차순으로 정렬한 뒤
  • 한 줄에 하나씩 출력하기

입력과 출력 조건

  • 입력:
    • 첫 번째 줄에 숫자의 개수 N이 주어져요 (1 ≤ N ≤ 1,000,000).
    • 두 번째 줄부터 N개의 정수가 한 줄에 하나씩 주어져요. (각 정수는 -1,000,000부터 1,000,000 사이)
  • 출력:
    • 정렬된 정수들을 한 줄에 하나씩 출력해요.

제약 조건

  1. N이 최대 1,000,000까지 갈 수 있어서 효율적인 정렬 알고리즘이 필요해요.
  2. 입력 데이터가 많기 때문에 빠르게 입력받고 출력하는 방법도 중요해요.

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보다 빠르게 출력할 수 있어요.

반응형