Quick_selection 은 N개의 요소 중에서 정렬했을 때 K번째 요소의 값을 알고싶다면
K번째 요소의 값을 알 때 까지만 정확히 정렬을 구현하고 나머지 필요없는 계산은 하지않는 방법이다.
사실상 전체정렬이 다 필요하지 않은 경우라면 나머지계산은 할 필요가 없기 때문이다.
11004번은 뭔가 문제가 많이 심오하다.
여러 많은 블로그들을 보며 quick selection 을 공부하였지만
결국 핵심은 partition 함수를 잘 작성했느냐 못했느냐 이다.
pivot 의 위치를 어떻게 조절하느냐에 따라 최악의 경우 O(N^2) 까지도 갈 수 있기 때문이다.
백준의 djm03*** 님 공지글을 읽어보면 quick sort 자체가 최악의 경우 O(N^2) 에 걸리는 부분이 많다고 하셨다.
당장 11004번은 STL의 sort를 이용해서 O(NlogN) 으로 문제가 풀리긴 한다
하지만 문제가 요구하는대로 풀려면 분명 quick selection 을 이용하는것이 맞다.
문제는 일단 STL 에 구현된 원하는 지점까지만 정렬을 하는 nth_element 를 사용해서 풀었지만
quick selection 을 공부하고자 코드는 직접 작성해보고 있다.
계속 시간초과가 나서 기존의 알고있던 quick sort 의 partition 부분은 .. 버릴려고한다 ㅠㅠ
partition 함수를 pivot이 첫번째 값일때부터 끝값까지 다 검사하는 방식을 쓰니 시간초과가 난다.
최악의 경우인 인풋값에 걸리나보다.
pivot을 중간에 두고 start 와 mid+1 을 기준으로 하는 방식인
merge 방식의 partition 을 사용해서 통과하는 분을 보았으니
merge 방식으로 partition 을 고려해볼만한 것 같다.
quick selection 의 정확한 개념을 알고 싶으신 분들은 참조해보면 좋을 것 같다.
항상 애용하는 Crocus 님 : https://www.crocus.co.kr/403
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include <iostream>
#include <algorithm>
using namespace std;
int arr[5000001];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N, K;
cin >> N >> K;
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
nth_element(arr, arr + (K - 1), arr + N);
cout << arr[K-1];
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
'algorithm > BOJ' 카테고리의 다른 글
BOJ 9012번 괄호 (0) | 2020.01.11 |
---|---|
BOJ 10828번 스택 (0) | 2020.01.11 |
BOJ 11652번 카드 (0) | 2020.01.11 |
BOJ 10989번 수 정렬하기 3 (0) | 2020.01.10 |
BOJ 10825번 국영수 (0) | 2020.01.10 |