링크: https://school.programmers.co.kr/learn/courses/30/lessons/138477?language=cpp
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1. 문제 접근
이 문제는 매일 새로운 점수가 들어올 때마다 상위 k개의 점수만 유지하고, 그중 가장 낮은 점수를 정답 배열에 저장하는 문제이다.
<핵심>
현재까지 나온 점수 중 상위 k개만 남긴다.
그중 최하위 점수를 answer에 넣는다.
- 따라서 점수를 저장할 벡터를 하나 만들고, 매번 정렬해서 상위 k개만 관리하면 된다.
2. 풀이(2개)
- 1번 풀이
- 첫 번째 풀이는 매일 점수를 벡터에 넣고, 내림차순 정렬한 뒤 k개를 초과하면 가장 낮은 점수를 제거하는 방식이다.
#include <string> #include <vector> #include <algorithm> using namespace std; vector<int> solution(int k, vector<int> score) { vector<int> answer; vector<int> my; for(int i = 0; i < score.size(); i++) { my.push_back(score[i]); // 매일 점수를 벡터에 넣고 sort(my.begin(), my.end(), greater<int>()); // 내림차순 정렬 if(my.size() > k) { // k개 초과하면 my.pop_back(); // 가장 낮은점수 제거 } answer.push_back(my.back()); } return answer; } - 2번 풀이
- 두 번째 풀이는 벡터의 크기를 처음부터 최대 k개까지만 유지하는 방식이다.
#include <string> #include <vector> #include <algorithm> using namespace std; vector<int> solution(int k, vector<int> score) { vector<int> answer; vector<int> temp; for(int i = 0; i < score.size(); i++) { if(temp.size() < k) { // 아직 점수가 k명으로 가득 차지 않았다면 temp.push_back(score[i]); // 점수 추가 } // k명 넘었고, 새로 오는 점수(score[i])가 > 최하위 점수(temp.back())보다 크다면, else if(temp.back() < score[i]) { temp.back() = score[i]; // 최하위 점수 새로오는 점수로 교채 } sort(temp.begin(), temp.end(), greater<int>()); // 내림차순 정렬 answer.push_back(temp.back()); // 가장 작은수 push_back } return answer; }
3. 문법
- pop_back()
- 벡터의 마지막 원소를 제거하는 함수이다.
vector<int> v = {100, 50, 10}; v.pop_back(); v = {100, 50} //1번 풀이 에서는 상위 k개를 초과했을 때 가장 낮은 점수를 제거하기 위해 사용했다.
4. 최종 요약
이 문제의 핵심은 상위 k개의 점수만 유지하는 것이다.
| 구분 | 설명 |
| 풀이 1 | 새 점수를 추가하고, 정렬 후 k개를 초과하면 제거 |
| 풀이 2 | k개까지만 저장하고, 최하위 점수보다 큰 경우 교체 |
| 공통 핵심 | 내림차순 정렬 후 back()이 최하위 점수 |
풀이 1은 흐름이 직관적이다.
추가 → 정렬 → k개 초과 시 제거 → 최하위 점수 저장
풀이 2는 벡터 크기를 최대 k개로 유지한다.
k개 미만이면 추가
k개 이상이면 최하위 점수와 비교 후 교체
결국 두 풀이 모두 명예의 전당을 내림차순으로 관리하고, 매일 가장 낮은 점수를 정답 배열에 저장하는 방식이다.
'코테 정리 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/C++] [1차]비밀지도 (Lv.1) (0) | 2026.06.02 |
|---|---|
| [프로그래머스/C++] 문자열 내마음대로 정렬하기 (Lv.1) (0) | 2026.05.23 |
| [프로그래머스/C++] 숫자 문자열과 영단어 (Lv.1) (0) | 2026.05.21 |
| [프로그래머스/C++] 두 개 뽑아서 더하기 (Lv.1) (0) | 2026.05.20 |
| [프로그래머스/C++] 시저 암호 (Lv.1) (0) | 2026.05.18 |
