프로그래머스 인사고과

피나코·2023년 2월 7일
0

알고리즘

목록 보기
40/46
post-thumbnail

프로그래머스 인사고과 바로가기

문제 설명

직원들의, 근무태도와 동료평가 두 점수가 주어진다.

자기 자신보다 근무태도와 동료평가 두 점수 둘 다 높은 경우가 있다면 해당 직원은 인센티브를 못 받는다.

인센 못받는 직원을 제외해서

근무태도 + 동료평가 가 높은 순으로 등수를 매기는데 동점인 사람들은 같은 등수를 받게 된다.

하지만 1등이 3명이라면 다음 등수는 2등이 아니라 4등부터 시작한다.

접근 방식

정렬을 두 번 해준다.

첫 번째 정렬은 근무태도는 내림차순으로, 근무태도 점수가 같다면 동료평가는 오름차순으로 정렬한다.

scores 배열을 탐색하면서 전의 직원의 동료평가 점수보다 지금 직원의 동료평가 점수가 낮다면 해당 직원은 인센티브를 받을 수 없다. 해당 직원의 점수를 음수로 다 바꿔준다.

만약에 완호 점수가 이에 해당된다면 answer를 -1로 해준뒤 두 번째 정렬은 수행하지 않는다.

두 번째 정렬은 근무태도 + 동료평가 합을 기준으로 내림차순 해준다. (인센티브를 못받는 직원들은 두 점수가 다 음수로 바뀌었으니 제일 뒷단으로 가게 된다)

배열을 탐색하면서 완호 점수의 index + 1의 값을 출력하면 된다.

코드

import java.util.*;

class Solution {
    public int solution(int[][] scores) {
        int answer = 0;
        
        int wanhoAtt = scores[0][0];
        int wanhoPeer = scores[0][1];     
        
        Arrays.sort(scores, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);   
        
        int k = scores[0][1];
        
        for(int[] score : scores){
            if(k > score[1]){
                if(wanhoAtt == score[0] && wanhoPeer == score[1]) {
                    answer = -1;
                    break;
                }
                score[0] = -1;
                score[1] = -1;
            }else{
                k = score[1];
            }
            
        }
        
        if(answer != -1){
            Arrays.sort(scores, (o1, o2) -> o2[0] + o2[1] - o1[0] - o1[1]);
            for(int i = 0; i < scores.length; i++){
                if(wanhoAtt == scores[i][0] && wanhoPeer == scores[i][1]){
                    answer = i + 1;
                    break;
                }
            }
        }
        return answer;
    }
}

Disscussion

처음에는 두 점수 둘 다 오름차순으로 해준 뒤 이분탐색으로 자기 보다 높은 점수를 가진 직원있는지를 찾으려 했다. 물론 이분 탐색으로도 시간초과가 안날것이지만, 이 문제는 이렇게 정렬을 잘 활용해서 푸는게 좀 더 맞게 푸는 방법 같다.

profile
_thisispinako_

0개의 댓글

관련 채용 정보