C++ 코딩테스트 강좌, 카드 정렬하기

최근 몇 년 간 프로그래밍 및 알고리즘 문제 해결 능력은 IT 업계뿐만 아니라 다양한 분야에서 매우 중요한 평가 기준이 되었습니다. 본 강좌에서는 ‘카드 정렬하기’라는 문제를 통해 기본적인 조작과정, 알고리즘 설계 및 최적화를 배워보도록 하겠습니다. 이 문제는 실무 및 코딩 테스트에서 중요한 정렬 알고리즘의 이해도를 높이는 데 도움이 됩니다.

문제 설명

옛날 카드 게임에서는 카드의 숫자를 정렬하는 것이 필수적입니다. 여러분은 N장의 카드가 있고, 각 카드마다 정수가 적혀 있습니다. 여러분은 이 카드를 오름차순으로 정렬해야 합니다. 하지만, 이 과정에서 몇 가지 규칙이 있습니다:

  • 카드는 정수로 이루어져 있으며, 정렬된 순서로 나열해야 합니다.
  • 카드의 개수 N (1 ≤ N ≤ 10^6) 입니다.
  • 카드에 적힌 숫자는 -10^9 ≤ 숫자 ≤ 10^9 범위 내의 정수입니다.

입력 형식

첫 줄에 카드의 개수 N이 주어지고, 다음 N개의 줄에는 각 카드의 숫자가 주어집니다.

출력 형식

카드를 오름차순으로 정렬한 후, 각 카드의 숫자를 한 줄에 하나씩 출력합니다.

예제

입력:
5
3
1
4
1
5

출력:
1
1
3
4
5

문제 해결 전략

이 문제는 정렬 문제로, 여러 가지 정렬 알고리즘을 사용할 수 있습니다. 그러나 주어진 범위를 고려할 때, 기본적인 정렬 알고리즘인 퀵 정렬이나 병합 정렬을 활용하는 것이 좋습니다. 이 강좌에서는 C++의 STL에 포함된 std::sort 함수를 사용하여 효율적으로 문제를 해결하는 방법을 보여드리겠습니다.

STL 표준 라이브러리의 sort() 함수

C++의 표준 템플릿 라이브러리(STL)에는 sort() 함수가 포함되어 있습니다. 이 함수는 인자로 주어진 컨테이너의 요소들을 정렬해줍니다. std::sort는 평균적으로 O(N log N) 시간복잡도를 가지며, 매우 효율적입니다.

코드 구현


#include <iostream>
#include <vector>
#include <algorithm> // sort()를 사용하기 위해 포함합니다.

int main() {
    int N;
    std::cin >> N; // 카드의 개수 입력받기
    std::vector<int> cards(N); // 카드 숫자를 저장할 벡터 생성

    // 카드 숫자 입력받기
    for (int i = 0; i < N; i++) {
        std::cin >> cards[i];
    }

    // 카드 숫자 정렬
    std::sort(cards.begin(), cards.end());

    // 정렬된 카드 숫자 출력
    for (int i = 0; i < N; i++) {
        std::cout << cards[i] << std::endl;
    }

    return 0;
}

코드 분석

위 코드는 다음과 같은 과정으로 구성되어 있습니다:

  1. 라이브러리 포함: #include <iostream>, #include <vector>, #include <algorithm>를 포함하여 입력과 출력 및 정렬을 위한 기본 라이브러리를 추가합니다.
  2. 입력: 사용자로부터 카드의 개수 N을 입력받고, 이후 N개의 카드 숫자를 벡터에 저장합니다.
  3. 정렬: std::sort() 함수를 사용하여 벡터에 저장된 카드 숫자를 오름차순으로 정렬합니다. 이때, begin()end() 메소드를 사용하여 시작과 끝 위치를 설정합니다.
  4. 출력: 정렬된 카드 숫자를 출력합니다.

시간 복잡도 분석

위에서 언급한 std::sort() 함수는 평균적으로 O(N log N) 복잡도로 작동합니다. 이는 대량의 데이터를 처리하는 데 매우 효율적입니다. 입력 크기 N이 최대 10^6일 때, 정렬을 수행하는데 충분한 시간 내에 실행가능합니다.

결론

이번 강좌를 통해 카드 정렬 문제를 해결하는 과정을 배웠습니다. 문제를 해결하기 위해 STL의 sort() 함수를 활용하여 간단하면서도 효율적인 코드를 작성할 수 있었습니다. 이러한 정렬 알고리즘은 많은 프로그래밍 문제와 실제 상황에서도 자주 사용되므로, 잘 익히고 활용하는 것이 중요합니다.

다음 시간에는 추가적인 알고리즘 문제를 통해 여러분의 코딩 테스트 능력을 한층 더 발전시켜보도록 하겠습니다.

감사합니다!