C++ 초급 - 11. 표준 라이브러리(STL) (5 - std::algorithm (정렬 및 탐색 알고리즘))

2025. 2. 22. 17:51프로그래밍 언어/C++

📌 11.5 std::algorithm (정렬 및 탐색 알고리즘)

C++ 표준 라이브러리(STL)의 <algorithm> 헤더는 정렬, 탐색, 반복 처리 등의 다양한 알고리즘을 제공하여 코드의 효율성과 가독성을 향상시킨다.
특히 std::sort, std::find, std::for_each 등은 자주 사용되는 핵심 알고리즘이다.


📌 1. std::sort를 활용한 정렬

🔹 (1) std::sort 기본 정렬

  • 배열 또는 벡터의 요소를 오름차순으로 정렬.
  • 기본적으로 operator<을 사용하여 정렬.

💡 예제: std::sort를 활용한 정렬

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v = {5, 3, 1, 4, 2};

    std::sort(v.begin(), v.end());  // 오름차순 정렬

    std::cout << "정렬된 벡터: ";
    for (int num : v) std::cout << num << " ";
    std::cout << std::endl;

    return 0;
}

🔹 출력 결과

정렬된 벡터: 1 2 3 4 5

💡 설명

  • std::sort(v.begin(), v.end()) → 오름차순 정렬 수행.
  • 퀵소트 기반으로 평균 시간 복잡도 O(N log N).

📌 2. std::find를 활용한 원소 탐색

🔹 (1) std::find 기본 사용법

  • 특정 값을 찾아 해당 위치의 반복자를 반환.
  • 값이 없으면 end()를 반환.

💡 예제: std::find를 활용한 탐색

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v = {10, 20, 30, 40, 50};

    auto it = std::find(v.begin(), v.end(), 30);

    if (it != v.end()) {
        std::cout << "값 30을 찾았습니다!" << std::endl;
    } else {
        std::cout << "값 30이 없습니다!" << std::endl;
    }

    return 0;
}

🔹 출력 결과

값 30을 찾았습니다!

💡 설명

  • std::find(v.begin(), v.end(), 30) → 값 30을 찾고 위치 반환.
  • 존재하지 않는 값이면 v.end() 반환.

📌 3. std::for_each를 활용한 반복 처리

🔹 (1) std::for_each 기본 사용법

  • 컨테이너의 모든 요소에 특정 작업을 수행.

💡 예제: std::for_each를 사용한 출력

#include <iostream>
#include <vector>
#include <algorithm>

void print(int n) {
    std::cout << n << " ";
}

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    std::cout << "벡터 요소: ";
    std::for_each(v.begin(), v.end(), print);
    std::cout << std::endl;

    return 0;
}

🔹 출력 결과

벡터 요소: 1 2 3 4 5

💡 설명

  • std::for_each(v.begin(), v.end(), print) → 모든 요소를 print 함수로 출력.

📌 4. std::reverse, std::min_element, std::max_element

🔹 (1) std::reverse (컨테이너 뒤집기)

💡 예제: std::reverse 사용

std::vector<int> v = {1, 2, 3, 4, 5};
std::reverse(v.begin(), v.end());  // 요소 순서 뒤집기

🔹 (2) std::min_element (최솟값 찾기)

💡 예제: std::min_element 사용

auto minIt = std::min_element(v.begin(), v.end());
std::cout << "최솟값: " << *minIt << std::endl;

🔹 (3) std::max_element (최댓값 찾기)

💡 예제: std::max_element 사용

auto maxIt = std::max_element(v.begin(), v.end());
std::cout << "최댓값: " << *maxIt << std::endl;

📌 5. 람다 표현식을 활용한 커스텀 정렬

🔹 (1) std::sort에 람다를 사용하여 내림차순 정렬

💡 예제: std::sort를 활용한 내림차순 정렬

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v = {5, 3, 1, 4, 2};

    std::sort(v.begin(), v.end(), [](int a, int b) {
        return a > b;  // 내림차순 정렬
    });

    std::cout << "내림차순 정렬된 벡터: ";
    for (int num : v) std::cout << num << " ";
    std::cout << std::endl;

    return 0;
}

🔹 출력 결과

내림차순 정렬된 벡터: 5 4 3 2 1

💡 설명

  • 람다 표현식을 사용하여 정렬 기준을 커스텀 (a > b → 내림차순).
  • 함수를 따로 선언하지 않고 즉시 정의하여 사용 가능.

📌 6. 정리

알고리즘 설명
std::sort 배열 또는 벡터를 정렬 (O(N log N))
std::find 특정 값을 찾아 위치 반환 (O(N))
std::for_each 컨테이너의 모든 요소에 특정 연산 수행
std::reverse 컨테이너의 요소 순서를 반대로 변경
std::min_element 컨테이너에서 최솟값 찾기
std::max_element 컨테이너에서 최댓값 찾기
람다를 활용한 정렬 std::sort에서 커스텀 정렬 기준 적용 가능