| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- unity게임
- Unity
- 백준 C++
- c#기초문법
- unity3d게임만들기
- 백준코딩테스트
- 백준 구현문제
- 티스토리챌린지
- C#문법
- 백준코테
- 백준 c++ 공부
- 바킹독알고리즘
- c#기본문법
- 유니티게임만들기
- 유니티3dui
- c#
- unity3dservival
- c# c#프로그래머스
- unity3d
- unity게임만들기
- 유니티서바이벌게임만들기
- 오블완
- 유니티공부
- 유니티
- c#프로그래머스기초문법
- c#코테
- c#코딩기초트레이닝
- c#문제
- 바킹독
- 백준
- Today
- Total
나 개발자 진짜 되냐?
백준 C++ 25305번 커트라인 ( sort, nth_element ) 본문

요즘 읽고 있는 책에서
일의 우선순위를 정하라고 알려주었다.
반드시 해야 함
해야 함
하면 좋음
이렇게 3단계로 나누어서 하면 좋다고 했다.
내 다이어리에 그렇게 쓰려니 뭔가? 뭔가??? 좀 잘 안된다..ㅋㅋ
흠.....
그렇게 내 다이어리에 어떻게 정리하지? 를 두 시간이나 고민했다.
이왕 쓰는 거 예쁘게 쓰고 싶은 내 마음이다.

내 계획은 이랬다.
vector로 받고 내림차순으로 정리한 다음에
k값을 내라고 하면 될 거 같았다. 뭐 정확히 k-1이겠지만
흠..

그렇다. 이 사람 sort를 까먹은 모양새다.
제씨를 찾으러 갔다.
똑똑한 녀석 나에게 바로 sort의 함수 사용법을 모르냐고 물었다.
ㅋㅋㅋㅋㅋㅋ
sort
정렬
기본적인 사용법은 시작지점과 끝 지점을 인자로 주는 것
sort(v.begin(), v.end());
그럼 반대는?
sort(v.end(), v.begin());
반대로 해주면 될 거 같지만? 그렇지 않다..
그냥 원래식에다가
greater<int>()를 달아주어야 한다.
그래서
sort(v.begin(), v.end(), greater<int>());
이렇게 해주어야 한다고 한다.
잊지 마시오!! <int> 하고 괄호 두 개가 꼭 필요하다..ㅎㅋ
그리고 굳이 뭐 내림차순으로 꼭 할 필요도 없다.
오름차순으로 하고 출력을 전체에서 k번째로 빼주면 ( 사실은 더 ) 간단하다.

나의 제씨..
더 좋은 방법이 있다며 또 나의 글을 늘리게 해 주는군..
사실 이 sort의 경우 모든 글자를 확인하고 정렬하기 때문에
시간복잡도가 O(n log n)이라고 한다.
하지만 O(n)인 방법도 있다는데
그의 이름
nth_element
전체 정렬을 하지 않고, 기준점을 잡아 특정 요소만 제 위치에 가져다주는 함수이다.
이 친구는몇 번째 자리에 올 친구만 찾고 나머지는 대충 그거보다 큰지 작은지만 분류해 준다.
sort랑 사용법이 비슷하다
기본형은
(시작, 찾고자 하는 지점, 끝) 이여서
nth_element(v.begin(), v.begin() + (k - 1), v.end());
이고
내림차순은 아까 그 보라친구
greater<int>() 를 써서
nth_element(v.begin(), v.begin() + (k - 1), v.end(), greater<int>());
해주면 된다.
이 친구의 원리가 궁금해져서 알아보았다.
1000명의 학생이라고 예시를 들어보자
딱 10등의 학생의 점수를 가지고 싶다.
그렇다면 먼저
아무나 뽑는다. 이 친구가 80점이라고 치면
80점보다 낮은애 들은 그냥 다 왼쪽으로 보낸다.
툭툭툭툭
흠.. 줄을 세워보니 80 이상이 100명이네?
그러면 다시 80보다 높은 점수를 기준으로 잡고
오른쪽 왼쪽 툭툭툭툭 해줘서
10등을 찾은 것이다!
900명은 굳이 79가 누군지 60이 누군지 정렬해 줄 필요 없으니 계산 외가 된다.
이 기준점을 내부 알고리즘이 스스로 결정한다고 한다.
참 신기하다.
숫자가 커지면, 이 친구가 더 효율적이라고 한다.
알았다.
nth_element 친구를 배웠다.

'C++을 시작해봐요! > 구현문제를 풀어봤어요!' 카테고리의 다른 글
| 백준 C++ 9506번 약수들의 합 ( 제곱근, 완전수 ) (2) | 2026.01.19 |
|---|---|
| 백준 C++ 11005번 진법 변환 2 ( reverse, 몫과 나머지 ) (0) | 2026.01.16 |
| 백준 C++ 11723번 집합 ( 비트마스크 ) (0) | 2026.01.14 |
| 백준 C++ 2747번 피보나치 수 ( 배열 ) (0) | 2026.01.13 |
| 백준 C++ 2745번 진법 변환 ( 진수는 누적 곱! ) (0) | 2026.01.12 |
