N번재 값 찾기

2025. 2. 10. 11:45·내배캠/C++

📌 nth_element

nth_element는 주어진 범위에서 n번째로 작은 원소를 해당 위치로 이동시키고
이를 기준으로 왼쪽에는 더 작은 원소들, 오른쪽에는 더 큰 원소들이 반정렬 상태로 배치되도록 만든다.
  • 완전히 정렬된 상태는 아니지만, 특정 원소의 위치를 빠르게 찾아낼 때 유용하다.
  • 내부적으로 퀵소트(Quick Sort)의 파티셔닝 로직과 유사한 방식으로 작동한다.
  • 평균 시간 복잡도는 O(n)이다.

 


 

📍세 번째로 작은 원소 구하기

#include <iostream>
#include <vector>
#include <algorithm> // nth_element

using namespace std;

int main() {
    vector<int> v = {9, 1, 4, 7, 2, 6};

    // 세 번째로 작은 원소를 위치시킴
    nth_element(v.begin(), v.begin() + 2, v.end());

    cout << "세 번째로 작은 원소: " << v[2] << endl;  // 출력: 4
    return 0;
}
  • v.begin() + 2는 세 번째로 작은 원소가 있어야 할 위치를 나타낸다.
  • nth_element를 호출하면 배열은 다음과 같은 형태가 될 수 있다:
    {1, 2, 4, (나머지 원소들)} → 왼쪽은 4보다 작고, 오른쪽은 4보다 크다.

 

📍짝수 중, 세 번째로 큰 원소 찾기

#include <iostream>
#include <vector>
#include <algorithm> // nth_element

using namespace std;

int main() {
    vector<int> v = {15, 3, 9, 8, 5, 2, 10, 7, 6};
    vector<int> temp;

    // 짝수만 temp 벡터에 추가
    for (int i = 0; i < v.size(); ++i) {
        if (v[i] % 2 == 0) {
            temp.push_back(v[i]);
        }
    }

    // 짝수 중 세 번째로 큰 값을 찾기 위해 내림차순 정렬 기준으로 nth_element 적용
    nth_element(temp.begin(), temp.begin() + 2, temp.end(), greater<int>());

    cout << "짝수 중 세 번째로 큰 값: " << temp[2] << endl;  // 출력: 6
    return 0;
}
  • 짝수만 따로 벡터 temp에 저장한다: {8, 2, 10, 6}
  • greater<int>()를 사용하여 내림차순 기준으로 정렬하도록 한다.
  • 세 번째로 큰 값이 temp[2] 위치에 저장되며 출력된다.

 


 

✅ nth_element의 장단점

🟢 장점

  • 빠른 실행 속도: O(n)의 평균 시간 복잡도를 가지기 때문에, 특정 순위의 원소를 찾을 때 전체 정렬을 수행하는 것보다 효율적이다.
  • 메모리 절약: 전체 정렬 대신 필요한 부분만 정렬하기 때문에 메모리 사용량이 적다.

🔴 단점

  • 정확한 정렬이 필요한 경우 부적합: 전체 배열을 정렬하는 목적이 아니라 특정 위치의 원소만 정렬하기 때문에 완전한 정렬이 필요하면 별도의 정렬 알고리즘(sort)을 사용해야 한다.
  • 최악의 경우 O(n²): 불균형한 분할이 발생할 경우 퀵소트와 마찬가지로 시간 복잡도가 최악의 경우 O(n²)까지 증가할 수 있다.

 


 

🔔 정리

  • nth_element는 전체를 정렬하지 않고 특정 위치의 원소를 빠르게 찾을 때 유용하다.
  • 완전한 정렬이 필요하지 않다면, 효율적으로 데이터를 처리하는 데 적합하다.
  • 정렬 기준(오름차순, 내림차순)을 잘 설정하면 다양한 상황에서 활용 가능하다.

 

 

 

'내배캠 > C++' 카테고리의 다른 글

브루트 포스(Brute Force)  (0) 2025.03.10
STL 정리  (0) 2025.02.17
순열 구하는 STL 함수 next_permutation(), prev_permutation()  (0) 2025.02.10
온라인 학습 관리 시스템 구현  (0) 2025.02.05
피보나치 수열  (1) 2025.02.04
'내배캠/C++' 카테고리의 다른 글
  • 브루트 포스(Brute Force)
  • STL 정리
  • 순열 구하는 STL 함수 next_permutation(), prev_permutation()
  • 온라인 학습 관리 시스템 구현
동그래님
동그래님
  • 동그래님
    개발자 동그래
    동그래님
  • 전체
    오늘
    어제
    • 분류 전체보기 (210)
      • 공부 (51)
        • Code Cata (50)
      • 내배캠 (151)
        • TIL (50)
        • C++ (37)
        • Unreal Engine (48)
        • GAS(Gameplay Ability System.. (16)
      • Project (7)
        • Gunfire Paragon (5)
        • Arena Fighters (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    동그래님
    N번재 값 찾기
    상단으로

    티스토리툴바