Post

알고리즘 템플릿(코테용)

1) 정렬 + 커스텀 비교

기본 문법 특징 대표 상황
sort(v.begin(), v.end()); 빠른 정렬, 안정성 없음 일반 정렬
stable_sort(v.begin(), v.end()); 안정 정렬 → 입력 순서 유지 입력 순서 유지 필요시
partial_sort(v.begin(), v.begin()+k, v.end()); 앞쪽 k개만 정렬 Top-k 문제
nth_element(v.begin(), v.begin()+k, v.end()); k번째 원소 위치, 나머지 정렬 X 중앙값, 순위 구하기
reverse(v.begin(), v.end()); 순서 뒤집기 내림차순, 뒤집기 용도
sort(arr, arr+n); C 배열 정렬 배열 정렬 시 사용
sort(v.begin(), v.end(), greater<int>()); 내림차순 정렬 내림차순 정렬 필요할 때

커스텀 비교 (람다)

1
2
3
4
sort(vec.begin(), vec.end(), [](auto &a, auto &b){
    if (a.first == b.first) return a.second < b.second;
    return a.first < b.first;
});


2) 그리디 + 정렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int N;
cin >> N;
vector<pair<int,int>> arr(N); // {기준값1, 기준값2}

for (int i = 0; i < N; i++) {
    cin >> arr[i].first >> arr[i].second;
}

// 기준 정렬
sort(arr.begin(), arr.end(), [](auto &a, auto &b) {
    if (a.first == b.first) return a.second < b.second; // tie-breaker
    return a.first < b.first; // 기본 정렬 기준
});

// 탐욕적 선택
int result = 0, last = 0;
for (int i = 0; i < N; i++) {
    if (조건) {  // ex: arr[i].first >= last
        result++;
        last = arr[i].second;
    }
}
cout << result;


3) BFS (최단거리)

1
2
3
4
5
6
7
8
9
10
11
12
queue<int> q;
dist[start] = 0;
q.push(start);
while (!q.empty()) {
    int u = q.front(); q.pop();
    for (int v : adj[u]) {
        if (dist[v] == -1) {
            dist[v] = dist[u] + 1;
            q.push(v);
        }
    }
}


4) 이분탐색

1
2
3
4
5
6
int lo=0, hi=n-1, ans=-1;
while (lo<=hi) {
    int mid = (lo+hi)/2;
    if (arr[mid] >= target) { ans = mid; hi = mid-1; }
    else lo = mid+1;
}
This post is licensed under CC BY 4.0 by the author.