백준
11004번 (silver 5)
이야기prog
2025. 1. 18. 15:18
https://www.acmicpc.net/problem/11004
stl에서 sort를 하면 간단하지만, 직접 구현해서 풀어보겠다.
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
void quickSort(vector<T>&, int s, int e);
template <typename T>
void swap(vector<T>&, int i, int j);
template <typename T>
int partition(vector<T>&, int i, int j);
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int N, num;
cin >> N >> num;
vector<int> arr(N, 0);
for (int i = 0; i < N; ++i) {
cin >> arr[i];
}
quickSort<int>(arr, 0, arr.size() - 1);
cout << arr[num - 1];
return 0;
}
template <typename T>
void quickSort(vector<T>& arr, int s, int e) {
if (s < e) {
int pivot = partition(arr, s, e);
quickSort(arr, s, pivot - 1);
quickSort(arr, pivot + 1, e);
}
}
template <typename T>
void swap(vector<T>& arr, int i, int j) {
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
template <typename T>
int partition(vector<T>& arr, int s, int e) {
int m = (s + e) / 2;
swap(arr, s, m);
int i = s + 1, j = e;
const int pivot = arr[s];
while (i <= j) {
while (i <= e && arr[i] < pivot) {
i++;
}
while (j >= s + 1 && arr[j] > pivot) {
j--;
}
if (i < j) {
swap(arr, i++, j--);
}
else
break;
}
arr[s] = arr[j];
arr[j] = pivot;
return j;
}
while (i <= e && arr[i] < pivot) {
i++;
}
while (j >= s + 1 && arr[j] > pivot) {
j--;
} 이 부분에서 i <= e && arr[i] < pivot가 arr[i] < pivot && i <= e처럼 순서가 바뀌면 error가 발생할 수 있는데,
컴파일러마다 다르겠지만, 조건문에서 and로 연결된 논리식을 평가할 때, 첫 번째 조건(A)이 False라면 나머지 조건(B)을 평가하지 않고 바로 False를 반환하는 최적화 기법인 "단축 평가(short-circuit evaluation)"가 적용되기 때문이다.