프로그래머스

[프로그래머스/Level 3/C++] 인사고과

Vfly 2023. 1. 19. 21:23

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

- 출처 : 프로그래머스 코딩 테스트 연습

 

프로그래머스

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

programmers.co.kr

 

[문제 요약]

- 각 사원마다 근무 태도 점수와 동료 평가 점수가 기록되어 있는데 만약 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한 번이라도 있다면 그 사원은 인센티브를 받지 못합니다.

- 그렇지 않은 사원들에 대해서는 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됩니다.

 

- 이때, 두 점수의 합이 동일한 사원들은 동석차이며, 동석차의 수만큼 다음 석차는 건너 뜁니다. 예를 들어 점수의 합이 가장 큰 사원이 2명이라면 1등이 2명이고 2등 없이 다음 석차는 3등부터입니다.

 

- 각 사원의 근무 태도 점수와 동료 평가 점수 목록 scores이 주어졌을 때, 완호의 석차를 return 하도록 solution 함수를 완성해주세요.

 

[문제 조건]

  • 1 ≤ scores의 길이 ≤ 100,000
  • scores의 각 행은 한 사원의 근무 태도 점수와 동료 평가 점수를 나타내며 [a, b] 형태입니다.
    • scores[0]은 완호의 점수입니다.
    • 0 ≤ a, b ≤ 100,000
  • 완호가 인센티브를 받지 못하는 경우 -1을 return 합니다.

 

[문제 풀이]

먼저 필자는 주어지는 scores의 배열을 첫 번째 원소를 기준으로 오름차순 정렬을 한 뒤 인센티브를 받을 수 있는 사원을 추려냈다.

 

추려내는 방법은 첫 번째 원소가 다를 때 두 번째 원소의 크기가 작은 사원은 배제하고, 그렇지 않은 사원들만 따로 모았다. 

for(int i=0; i<tmp.size(); i++)
{
    bool flag = true;
    for(int j=i+1; j<tmp.size(); j++)
    {
        if(tmp[j].first.first == tmp[i].first.first) continue;
        else
        {
            if(tmp[i].first.second < tmp[j].first.second)
            {
                flag=false; break;
            }
        }        
    }
    if(flag) tmp2.push_back(tmp[i]);
}

위의 코드에서 tmp배열은 scores 배열을 { { 근무태토 점수, 동료평가 점수 } , 인덱스 } 형태로 가공하고 정렬한 상태의 배열이다.

 

tmp2 배열은 tmp배열에서 인센티브를 받을 수 있는 사원들만 추가시킨 배열이다.

 

사원을 추려낸 뒤 다시 tmp2배열을 두 점수의 합을 기준으로 오름차순으로 정렬한 뒤 순위를 매겼다.

 

 

[소스 코드]

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

#define pii pair<int,int>

using namespace std;

bool cmp(pair<pii,int> &a, pair<pii,int> &b)
{
    if(a.first.first == b.first.first) return a.first.second <  b.first.second;
    else return a.first.first < b.first.first;
}
bool cmp2(pair<pii,int> &a, pair<pii,int> &b)
{
    return (a.first.first+a.first.second) > (b.first.first+b.first.second);
}

int solution(vector<vector<int>> scores) {
    int answer = -1;
    vector<pair<pii,int>> tmp;
    vector<pair<pii,int>> tmp2;
    for(int i=0; i<scores.size(); i++)
    {
        tmp.push_back({{scores[i][0], scores[i][1]}, i});
    }
    
    sort(tmp.begin(), tmp.end(), cmp);

    for(int i=0; i<tmp.size(); i++)
    {
        bool flag = true;
        for(int j=i+1; j<tmp.size(); j++)
        {
            if(tmp[j].first.first == tmp[i].first.first) continue;
            else
            {
                if(tmp[i].first.second < tmp[j].first.second)
                {
                    flag=false; break;
                }
            }        
        }
        if(flag) tmp2.push_back(tmp[i]);
    }
    
    sort(tmp2.begin(), tmp2.end(), cmp2);
    
    int sum = tmp2[0].first.first + tmp2[0].first.second;
    int cnt = 1;
    int cur_rank = 1;
    if(tmp2[0].second == 0) return 1;
    for(int i=1; i<tmp2.size(); i++)
    {
        if(sum == (tmp2[i].first.first + tmp2[i].first.second)) cnt++;     
        else
        {
            cur_rank += cnt;
            cnt=1;
            sum = tmp2[i].first.first + tmp2[i].first.second;
        }
        if(tmp2[i].second == 0) answer = cur_rank;
    }
    
    return answer;
}

 

레벨3 문제치고는 쉬운 문제였다.