프로그래머스 인사고과 java

배인성·2023년 2월 22일
0

프로그래머스

목록 보기
41/55
post-thumbnail

문제링크

문제 링크

문제 설명

제한사항

입출력 예

입출력 예 설명

풀이

  1. 인센티브를 못받는 사람을 거른다.
  2. 완호보다 점수 높은 사람마다 answer++를 한다.
  3. 인센티브를 못받는 사람을 걸러내기위해 근무태도 점수를 내림차순으로 정렬해보자.
  4. 정렬할 때, 근무태도 점수가 동점인 경우엔 동료 평가 점수를 오름차순으로 정렬해보자.
  5. 동료 평가 점수의 최댓값을 계속 갱신해가며 반복문을 돌건데, 갱신이 안된다는 뜻은 동일한 근태점수 내에서 오름차순으로 정렬된 동료 평가 점수가 갑자기 낮아졌다는 것을 의미한다.
    5-1 그 뜻은 내림차순으로 정렬된 근무태도 점수에 변화가 생겼다는 것이고, 해당 인덱스의 사원은 인센티브를 못받는다는 뜻이 된다.
  6. 그게 완호인지 아닌지만 계속 체크해주면 되고, 인센티브 대상자 중 점수 합이 완호보다 높으면 answer++!

처음에 나는 두 점수의 곱이 가장 큰 사람을 기준으로 모든 사람을 거를려했다.

그리고 이 방식대로 구현하니 테스트케이스도 60점 수준으로 어느정도 통과하고 다른 부분에서 문제점을 찾고있었는데 ㅜㅜ

근데 조금만 집중해서 반례를 찾아보니 [[1,2], [3,4],[5,6], [4,90000]] 과 같은 케이스가 나오더라..

두 점수의 곱은 [2,90000]가 제일 높지만 이 사원은 걸러져야할 사원인 [3,4]사원을 거르지 못한다 ㅋㅋㅋ

하.. 너무 당연한거였다... 처음에 생각할때 나는 4번을 생각하지 못했다.

그리고나서 질문하기에서 힌트를 얻어가며 풀었다 ㅜ 수학적인 센스를 좀 더 길러야겠다.

이런 센스는 일 할때도 좀 도움이 될 것 같다. (업무 내적으로가 아닌 일머리적으로)

코드

import java.util.*;
class Solution {
    public int solution(int[][] scores) {
        int answer = 1;
        int[] wanho = scores[0];
        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) {
                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;
    }
}
profile
부지런히 살자!!

0개의 댓글