HJW's IT Blog

[Programmers] 인사고과 [C++] 본문

Algorithm

[Programmers] 인사고과 [C++]

kiki1875 2024. 9. 2. 16:04

https://school.programmers.co.kr/learn/courses/30/lessons/152995

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 분석 및 접근 방식

이 문제는 직원들의 점수를 기반으로 인센티브를 지급할 때, 완호의 순위를 계산하는 것입니다. 여기서 중요한 점은 두 가지입니다:

  1. 인센티브 자격: 완호가 다른 직원에 비해 두 점수 모두 낮은 경우가 한 번이라도 있다면 인센티브를 받을 수 없습니다.
  2. 석차 계산: 인센티브를 받을 수 있는 직원 중 점수 합이 높은 순으로 석차를 매기며, 동석차가 존재할 경우 그 수만큼 다음 석차는 건너뛰게 됩니다.
  • 완호의 인센티브 자격 판단:
    • 완호와 다른 모든 직원의 점수를 비교하여, 완호가 다른 직원보다 두 점수가 모두 낮은 경우가 있으면 인센티브를 받을 수 없으므로 1을 반환합니다.
  • 직원들의 점수 합을 기준으로 정렬:
    • 완호를 제외한 모든 직원을 점수 합을 기준으로 내림차순으로 정렬합니다. 이때, 점수 합이 같다면 같은 순위로 처리합니다.
  • 완호의 석차 계산:
    • 정렬된 리스트에서 완호의 점수 합보다 높은 점수를 가진 직원 수를 세어 순위를 결정합니다.
  • 동석차 처리:
    • 동석차가 발생할 경우, 그만큼 다음 순위는 건너뛰어야 합니다.
#include <bits/stdc++.h>
using namespace std;

int solution(vector<vector<int>> scores) {
    int answer = 1;
    int wan_a = scores[0][0], wan_b = scores[0][1];
    int wan_sum = wan_a + wan_b;
    
    // 완호 제외 나머지 점수들만 정렬
    sort(scores.begin() + 1, scores.end(), [](vector<int>& a, vector<int>& b) {
        return a[0] + a[1] > b[0] + b[1];
    });

    // 완호의 인센티브 자격 체크
    for (int i = 1; i < scores.size(); i++) {
        if (wan_a < scores[i][0] && wan_b < scores[i][1]) {
            return -1; // 인센티브 자격 없음
        }
    }

    // 완호의 석차 계산
    for (int i = 1; i < scores.size(); i++) {
        int cur_sum = scores[i][0] + scores[i][1];
        if (cur_sum > wan_sum) {
            answer++;
        } else {
            break;
        }
    }

    return answer;
}

  • 합산 점수 정렬의 이유
    • 석차 계산의 단순화 → 점수 합이 높은 순서대로 정렬해 두면, 정렬된 리스트에서 순서대로 확인하면서 쉽게 석차를 계산할 수 있다.
    • 인센티브 자격 판단 단순화
    • 효율적인 동석차 처리