https://school.programmers.co.kr/learn/courses/30/lessons/152995
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr

오늘은 정렬에 관련된 문제입니다.
근무 태도, 동료 평가를 어떤 사원과 비교해 둘 다 저조한 사원이 있다면 인센티브를 받을 수 없습니다.
그리고 문제의 목표는 완호(scores[i])의 석차를 아는 것입니다.
따라서 인센티브를 받을 수 없는 사원을 거른 후 완호의 석차를 별개로 다시 구해야할 것입니다.(완호가 걸러지는 경우는 -1)
사원을 필터링하기 위해서는 일단 하나의 조건을 통해 내림차순으로 정렬 후 나머지 조건은 반대로 오름차순으로 정렬해 최댓값만 가진채 순회하면 필터링될 것입니다.
sort(scores.begin(), scores.end(), [](const vector<int>& a, const vector<int>& b)
{
if (a[0] == b[0])
return a[1] < b[1];
return a[0] > b[0];
});
int maxPeer = 0;
vector<pair<int, int>> goodWorkers;
for (int i = 0; i < N; ++i)
{
int work = scores[i][0];
int peer = scores[i][1];
if (peer < maxPeer)
{
if (work == targetWork && peer == targetPeer)
return -1;
}
else
{
goodWorkers.push_back({ work, peer });
maxPeer = max(maxPeer, peer);
}
}
전체 코드의 일부입니다.
maxPeer를 설정한다면 work는 이미 정렬되어있으므로 필터링이 가능하고 peer로도 필터링이 가능하게 됩니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 1. 근무 태도, 2. 동료 평가
// 어떤 사원 보다 두 점수가 모두 낮은 경우가 있다면 인센티브 x
// 아니라면 두 점수의 합이 높은 순으로 석차를 매김
// 동석차 처리는 1, 2, 2, 4 와 같은 방식
int solution(vector<vector<int>> scores) {
int answer = 0;
int N = scores.size();
int targetWork = scores[0][0];
int targetPeer = scores[0][1];
sort(scores.begin(), scores.end(), [](const vector<int>& a, const vector<int>& b)
{
if (a[0] == b[0])
return a[1] < b[1];
return a[0] > b[0];
});
int maxPeer = 0;
vector<pair<int, int>> goodWorkers;
for (int i = 0; i < N; ++i)
{
int work = scores[i][0];
int peer = scores[i][1];
if (peer < maxPeer)
{
if (work == targetWork && peer == targetPeer)
return -1;
}
else
{
goodWorkers.push_back({ work, peer });
maxPeer = max(maxPeer, peer);
}
}
sort(goodWorkers.begin(), goodWorkers.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
return a.first + a.second > b.first + b.second;
});
int rank = 0;
int prevScore = -1;
int accum = 1;
for (auto& goodWorker : goodWorkers)
{
int work = goodWorker.first;
int peer = goodWorker.second;
int score = work + peer;
if (score == prevScore)
++accum;
else
{
rank += accum;
accum = 1;
prevScore = score;
}
if (work == targetWork && peer == targetPeer)
return rank;
}
return answer;
}
전체 코드입니다.
생각해보니 완호의 등수만 필요하기 때문에 별도의 정렬없이 원 루프 안에서 모두 처리도 가능하겠네요
'Algorithm > PS' 카테고리의 다른 글
| [1일 1알고] 미로 탈출 명령어 (0) | 2026.06.07 |
|---|---|
| [1일 1알고] 자물쇠와 열쇠 (0) | 2026.06.04 |
| [1일 1알고] 표 편집 (0) | 2026.05.28 |
| [1일 1알고] 모두 0으로 만들기 (0) | 2026.05.27 |
| [1일 1알고] 등대 (0) | 2026.05.26 |