개발/뇌를 말랑하게하는 코테 연습

[프로그래머스 Lv3][C++] 인사고과

njsung 2023. 11. 7. 10:09
반응형

인사고과 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/152995

 

프로그래머스

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

programmers.co.kr


[구현 환경]

  • C++

[문제 설명]

  • 각 사원마다 [근무 태도 점수, 동료 평가 점수]가 기록되어 있음
  • 사원 A가 임의의 사원 B보다 두 점수가 모두 낮으면 인센티브 수령이 불가능함
  • 이외의 케이스는 두 점수의 합이 높은 순으로 석차를 매기고 첫번째 배열의 사원(완호)의 석차를 return

[제한 사항]

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

[함수 원형]

int solution(std::vector<std::vector<int>> scores)
{
	int answer = 0;
	return answer;
}

 

[풀이]

std::vector<std::vector<int>> scores = {
        {2,2},{1,4},{3,2},{3,2},{2,1} 
};
int solution(std::vector<std::vector<int>> scores) {
    int answer = 1;

    std::vector<int> target = scores.at(0);
    int target_sum = target.at(0) + target.back();

    std::sort(scores.begin(), scores.end(), [&](std::vector<int>& a, std::vector<int>& b) {
        if (a.at(0) == b.at(0)) return a.back() < b.back();
        return a.at(0) > b.at(0);
    });

    int MAX_VALUE = -1;

    for (auto& score : scores) {
        if (MAX_VALUE < score.back()) MAX_VALUE = score.back();
        else if (MAX_VALUE > score.back())
        {
            if (target.at(0) == score.at(0) && target.back() == score.back()) return -1;
            continue;
        }
        if (score.at(0) + score.back() > target_sum) answer++;
    }

    return answer;
}
  • at(0) : 근무 태도 점수     back(): 동료 평가 점수    target : 완호의 점수 배열     target_sum : 완호의 점수 합
  • 먼저 근무 태도 점수로 내림차순 정렬 / 점수가 같다면 동료 평가 점수로 오름차순 정렬 수행
  • 근무 태도 점수는 내림차순이기때문에 항상 바로 앞 사람보다 낮을 수 밖에 없음
  • 따라서 동료 평가 점수를 오름차순으로 정렬한 후 이 값만 체크해서 앞에 나온 점수값보다 낮은지, 높은지를 체크
  • 두 점수의 합이 완호의 점수 합보다 크면 석차를 한칸씩 증가시키고 결과 값 return
728x90

 

반응형