Tiny Bunny
본문 바로가기

programmers

프로그래머스 3단계 : 인사고과 (Java 자바)

728x90
문제 설명

 

완호네 회사는 연말마다 1년 간의 인사고과에 따라 인센티브를 지급합니다. 각 사원마다 근무 태도 점수와 동료 평가 점수가 기록되어 있는데 만약 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한 번이라도 있다면 그 사원은 인센티브를 받지 못합니다. 그렇지 않은 사원들에 대해서는 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됩니다. 이때, 두 점수의 합이 동일한 사원들은 동석차이며, 동석차의 수만큼 다음 석차는 건너 뜁니다. 예를 들어 점수의 합이 가장 큰 사원이 2명이라면 1등이 2명이고 2등 없이 다음 석차는 3등부터입니다.

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

 

 

제한 사항

 

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

 

입출력 예

 

 

풀이


각 사원의 근무 태도 점수와 동료 평가 점수를 기반으로 인센티브를 받을 수 있는 사원의 석차를 결정하는 문제입니다. 주어진 조건에 따라, 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한 번이라도 있다면 그 사원은 인센티브를 받지 못합니다.

 

1. answer 변수는 완호의 석차를 나타내며, 초기값은 1로 설정됩니다.

 

2. wanho 배열에는 완호의 근무 태도 점수와 동료 평가 점수가 저장됩니다.

 

3. scores 배열을 정렬하는데, 이때 Comparator 함수를 사용하여 첫 번째 요소(근무 태도 점수)를 기준으로 내림차순 정렬하고, 첫 번째 요소가 같을 경우 두 번째 요소(동료 평가 점수)로 오름차순 정렬합니다.

 

4. myPoint 변수에는 완호의 두 점수 합계를 저장하고, peerPoint 변수에는 다른 사람들 중 가장 높은 동료 평가점수를 저장하기 위해 0으로 초기화합니다.

 

5. scores 배열을 순회하면서 각 score 배열(사람별 [근무태도점수, 동료평가점수])을 검사합니다:

 


1. 만약 현재 score[1] (동료 평가점수) 가 peerPoint 보다 작다면, 현재 score 가 완호인지 확인하고 맞다면 완호는 인센티브 받지 못하므로 -1 반환

 

2. 그렇지 않으면 (즉 현재 score[1] 이 peerPoint 보다 크거나 같으면), peerPoint 업데이트: 현재 score[1] 과 peerPoint 중 큰 값을 peerPoint 로 설정

 

3. 만약 myPoint 가 현재 score 의 합계보다 작으면 answer 증강 (완호보다 상위 석차인 사람 발견)

 

answer 반환
scores: 각 행마다 하나의 사원의 근무 태도 점수와 동료 평가 점수를 담은 2차원 배열
answer: 완호의 석차를 나타내는 변수. 초기값은 1.
wanho: 완호의 근무 태도 점수와 동료 평가 점수를 담은 배열
myPoint: 완호의 두 점수 합계
peerPoint: 다른 사람들 중 가장 높은 동료 평가점수

 


1. 주어진 scores 배열을 정렬하여 근무 태도 점수가 높은 순서대로, 그리고 근무 태도 점수가 같다면 동료 평가점수가 낮은 순서대로 정렬합니다.

 

2. 각 score에 대해, 만약 현재 score[1] (동료 평가점수) 가 peerPoint 보다 작다면, 현재 score 가 완호인지 확인하고 맞다면 완호는 인센티브 받지 못하므로 -1 반환합니다.

 

3. 그렇지 않으면 (즉 현재 score[1] 이 peerPoint 보다 크거나 같으면), peerPoint 업데이트: 현재 score[1] 과 peerPoint 중 큰 값을 peerPoint 로 설정하고, 만약 myPoint 가 현재 score 의 합계보다 작으면 answer 증강 (완호보다 상위 석차인 사람 발견)합니다.

 

4. answer 값을 반환하여 완호의 최종 석차를 알려줍니다.

 

import java.util.*;

class Solution {
    public int solution(int[][] scores) {
        int answer = 1;
        int[] wanho = scores[0]; // 완호의 근무 태도 점수와 동료 평가 점수를 따로 저장합니다.
        
        // scores 배열을 근무 태도 점수로 내림차순 정렬합니다.
        Arrays.sort(scores, new Comparator<int[]>(){
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[0] < o2[0])
                    return 1;
                else if(o1[0] == o2[0]) {
                    if(o1[1] > o2[1])
                        return 1;
                    else
                        return -1;
                }
                else return -1;
            }
        });
        
        int myPoint = wanho[0] + wanho[1]; // 완호의 근무 태도 점수와 동료 평가 점수의 합을 계산합니다.
        int peerPoint = 0; // 동료 평가 점수를 비교하기 위한 변수를 초기화합니다.
        
        for(int[] score : scores) {
            if(score[1] < peerPoint) {
                // 다른 사원 중 완호보다 근무 태도 점수와 동료 평가 점수가 모두 낮으면 -1을 반환합니다.
                if(wanho[0] == score[0] && wanho[1] == score[1])
                    return -1;
            }
            else {
                peerPoint = Math.max(score[1], peerPoint); // 동료 평가 점수 중 최대값을 갱신합니다.
                
                // 완호의 근무 태도 점수와 동료 평가 점수의 합보다 큰 경우 석차를 증가시킵니다.
                if(myPoint < score[0] + score[1])
                    answer++;
            }
        }
        return answer;
    }
}
728x90