프로그래머스 인사고과 문제 풀이를 진행하였습니다.
문제를 읽으면 아래와 같은 해석이 가능합니다.
직원에게 인센티브를 지급하려 합니다.
각 사원은 근무 태도 점수, 동료 평가 점수가 기록되있으며, 어떤 사원이 다른 사원보다 두 점수가 낮을 경우 인센티브에서 제외됩니다.
인센티브를 받는 사람들 중에서 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급되며, 두 점수의 합이 동일한 사원들은 동석차이이고 동석차의 수만큼 다음 석차는 건너 뜁니다.
맨 처음으로 주어지는 두 점수가 완호의 점수일 때 완호의 석차를 구해야합니다.
두 점수를 비교하며 인센티브를 받지 못하는 사람을 제외한 모든 사람들을 높은 순으로 나열하였을 때의 순번을 찾는 문제입니다.
일단 인센티브를 받지 못하는 사원은 버려야 하므로, 두 점수를 비교하여 인센티브를 받지 못하는 사원을 찾아내야 합니다.
다른 사원보다 두 점수 모두 낮은 사원을 찾아내야 하므로 쉽게 검색하기 위해 한 점수를 내림차순으로 정렬해줍니다.
그렇게 되면 현재 검색하고 있는 사원의 점수는 이후에 나오는 사원의 점수보다 크거나 같게 됩니다.
이후 나머지 한 점수는 최대값을 검색하는 순서대로 찾아주며 최대값보다 낮은 사원을 인센티브를 받지 못하는 사원으로 빼주면 됩니다.
통과한 학생들은 완호의 두 점수의 합과 비교하여 더 클 경우 등수를 1씩 올려주면 됩니다.
#include <bits/stdc++.h>
#include <string>
#include <vector>
using namespace std;
bool compare(vector<int> a, vector<int> b){
if(a[0] > b[0])
return true;
else if(a[0] == b[0])
return a[1] < b[1];
else
return false;
}
int solution(vector<vector<int>> scores) {
int answer = 1;
//등수를 찾는 사원의 근무태도와 평가점수 저장
int workScore = scores[0][0];
int peerScore = scores[0][1];
//근무태도를 내림차순, 평가점수를 오름차순으로 정렬해줌
sort(scores.begin(), scores.end(), compare);
int maxVal = -1;
for(int i = 0; i < scores.size(); i++)
{
if(maxVal < scores[i][1]) //평가점수 제일 큰 값을 저장해줌
{
maxVal = scores[i][1];
}else if(maxVal > scores[i][1]) //근무태도는 내림차순으로 정렬했으니 무조건 같거나 낮으며, 평가점수도 낮다면 인센티브에서 제외
{
if(workScore == scores[i][0] && peerScore == scores[i][1]) //만약 등수를 찾는 사원이 인센티브에서 제외될 시
return -1;
continue;
}
if(workScore+peerScore < scores[i][0]+scores[i][1]) //두 점수의 합이 더 높은 사원 검색
answer++;
}
return answer;
}
https://school.programmers.co.kr/learn/courses/30/lessons/152995