호지

[프로그래머스] 인사고과 문제풀이 c++ 본문

알고리즘/프로그래머스

[프로그래머스] 인사고과 문제풀이 c++

_hoji

문제를 읽고 풀이과정에 대해 고민했습니다.

 

1단계 근무태도 점수(a)와 동료 평가 점수(b)를 보고 인센티브를 받지 못하는 경우를 거른다.

2단계 근무태도 점수(a)와 동료 평가 점수(b)의 합을 보고 등수를 나눈다.

 

1단계와 2단계의 과정을 거치면 원하는 답을 구할 수 있을 것이라 생각했고,

정렬된 데이터가 필요할 것이라고 생각했습니다.

 

1단계에서는 a기준으로 정렬하고, b기준으로 정렬을 2번하는 방법을 생각했으나,

2번의 정렬과정을 불필요해보였습니다.

그래서 a기준으로 내림차순 정렬을 하고

a값이 동일할 때는 b기준으로 오름차순 정렬을 했습니다.

정렬된 리스트에서 처음 값을 기준으로 삼고,

다음 원소가 a값과 b값 모두 작은 경우라면 해당 원소를 [-1, -1]로 초기화 했습니다.

(인센티브를 받지 못하는 경우)

이때, 해당 값이 완호의 점수라면 완호가 인센티브를 받지 못하는 경우이므로 -1를 return 합니다.

a값과 b값 모두 작은 경우가 아니라면, 그 위치에 해당하는 값을 기준으로 다시 삼았습니다.

위 과정을 완료하면 인센티브를 받지 못하는 사원은 [-1, -1]라는 점수를 갖고 있습니다.

a+b의 합을 기준으로 다시 scores 리스트를 정렬하고

원호의 등수를 구하면 원하는 결과를 구할 수 있습니다.

동석차를 구분하기 위해 same_prize라는 변수를 사용했습니다.

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

using namespace std;

bool cmp1(vector<int> &v1, vector<int> &v2){ 
    if(v1[0] == v2[0])
        return v1[1] < v2[1];
    return v1[0] > v2[0];
}
bool cmp2(vector<int> &v1, vector<int> &v2){
    return v1[0]+v1[1] < v2[0] + v2[1];
}

int solution(vector<vector<int>> scores) {
    int wanho_score1 = scores[0][0], wanho_score2 = scores[0][1];
    
    sort(scores.begin(), scores.end(), cmp1);
    
    int s1 = scores[0][0], s2 = scores[0][1];
    
    for(int i=0; i<scores.size(); i++){
        if(s1 > scores[i][0] && s2 > scores[i][1]){
            if(scores[i][0] == wanho_score1 && scores[i][1] == wanho_score2)
                return -1;
            scores[i][0] = -1;
            scores[i][1] = -1;
        }
        else{
            s1 = scores[i][0];
            s2 = scores[i][1];
        }
    }
    
    sort(scores.begin(), scores.end(), cmp2);
    
    int prize = 0, same_prize = 1, sum = 200001;
    
    for(int i=scores.size()-1; i >=0; i--){
        if(sum > scores[i][0] + scores[i][1]){
            sum = scores[i][0] + scores[i][1];
            prize += same_prize;
            same_prize = 1;
        }
        else
            same_prize++;
        if(scores[i][0] == wanho_score1 && scores[i][1] == wanho_score2)
            return prize;
    }
}

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

 

Comments