문제/프로그래머스

[프로그래머스] 인사고과- Java

icodesiuuuu 2024. 10. 18. 22:51

문제

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

 

프로그래머스

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

programmers.co.kr

 


문제 개요

이 문제는 각 사원의 근무 태도 점수와 동료 평가 점수가 주어졌을 때, 인센티브를 받을 수 있는 사원과 그들의 석차를 구하는 문제입니다. 특정 사원이 다른 사원들 중 어느 한 명이라도 두 점수 모두 낮다면 인센티브를 받지 못하며, 인센티브를 받을 수 있는 사원은 두 점수의 합에 따라 석차가 매겨집니다. 점수의 합이 동일한 사원은 동석차를 가지며, 이 석차에 따라 완호(첫 번째 사원)의 최종 석차를 구하는 것이 목표입니다.

접근 방법

  1. 정렬을 이용한 사원 필터링:
    • 사원들을 근무 태도 점수를 기준으로 내림차순 정렬합니다. 만약 근무 태도 점수가 동일하다면 동료 평가 점수를 오름차순으로 정렬합니다.
    • 정렬된 리스트를 순차적으로 탐색하면서, 동료 평가 점수가 이전에 처리한 사원의 동료 평가 점수보다 낮다면, 그 사원은 두 점수 모두 낮은 사원이므로 인센티브를 받을 수 없습니다.
    • 이 과정에서 완호가 필터링된 경우, 인센티브를 받을 수 없기 때문에 바로 -1을 반환합니다.
  2. 석차 계산:
    • 필터링된 사원들에 대해 두 점수의 합을 기준으로 다시 정렬합니다.
    • 두 점수의 합이 높은 순으로 탐색하며 완호보다 높은 점수의 사원이 몇 명인지를 세어 석차를 결정합니다.
    • 만약 두 점수의 합이 동일한 사원이 있을 경우, 그들은 모두 동일한 석차를 갖고, 다음 석차는 건너뜁니다.

이러한 방식으로 각 사원의 인센티브 가능 여부를 판단하고, 완호의 석차를 구할 수 있습니다.

 

import java.util.*;
class Solution {
    public int solution(int[][] scores) {
        int answer = 1;
        int[] target = {scores[0][0], scores[0][1]};
        
        Arrays.sort(scores, (o1, o2) -> {
            return o1[0]==o2[0] ? o1[1] - o2[1] : o2[0] - o1[0];
        });
        
        int num = scores[0][1];
        for(int i=1; i<scores.length; i++) {
            if(num > scores[i][1]) {
                if(scores[i][0]==target[0] && scores[i][1]==target[1]) return -1;
                scores[i][0] = scores[i][1] = -1;
            } else {
                num = scores[i][1];
            }
        }
        
        Arrays.sort(scores, (o1, o2) -> {
           return (o2[0]+o2[1]) - (o1[0]+o1[1]);
        });   
        
        for(int i=0; i<scores.length; i++) {
            if(scores[i][0] + scores[i][1] > target[0] + target[1]) answer++;
            else break;
        }
        
        return answer;
    }
}