프로그래머스 문제 - 인사고과

JUNWOO KIM·2024년 1월 4일
0

알고리즘 풀이

목록 보기
67/105

프로그래머스 인사고과 문제 풀이를 진행하였습니다.

문제 해석

문제를 읽으면 아래와 같은 해석이 가능합니다.

직원에게 인센티브를 지급하려 합니다.
각 사원은 근무 태도 점수, 동료 평가 점수가 기록되있으며, 어떤 사원이 다른 사원보다 두 점수가 낮을 경우 인센티브에서 제외됩니다.
인센티브를 받는 사람들 중에서 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급되며, 두 점수의 합이 동일한 사원들은 동석차이이고 동석차의 수만큼 다음 석차는 건너 뜁니다.
맨 처음으로 주어지는 두 점수가 완호의 점수일 때 완호의 석차를 구해야합니다.

문제 풀이

두 점수를 비교하며 인센티브를 받지 못하는 사람을 제외한 모든 사람들을 높은 순으로 나열하였을 때의 순번을 찾는 문제입니다.

일단 인센티브를 받지 못하는 사원은 버려야 하므로, 두 점수를 비교하여 인센티브를 받지 못하는 사원을 찾아내야 합니다.
다른 사원보다 두 점수 모두 낮은 사원을 찾아내야 하므로 쉽게 검색하기 위해 한 점수를 내림차순으로 정렬해줍니다.
그렇게 되면 현재 검색하고 있는 사원의 점수는 이후에 나오는 사원의 점수보다 크거나 같게 됩니다.

이후 나머지 한 점수는 최대값을 검색하는 순서대로 찾아주며 최대값보다 낮은 사원을 인센티브를 받지 못하는 사원으로 빼주면 됩니다.

통과한 학생들은 완호의 두 점수의 합과 비교하여 더 클 경우 등수를 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

profile
게임 프로그래머 준비생

0개의 댓글