BackEnd/알고리즘 공부

인사고과(프로그래머스) JAVA

인프라 감자 2023. 2. 28. 13:20

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

  • 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한번이라도 있다면 그 사원은 인센티브를 받지 못한다.
  • 그렇지 않은 사원은 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급된다.
  • 동석차이며, 동석차의 수만큼 다음 석차는 건너 뛴다.

입력이 이렇게 주어진다.

[2,2]는 완호의 근무 태도 점수와 동료 평가 점수이다. 

[2,1]은 [3,2] 보다 점수가 모두 낮으므로 인센티브를 받지 못한다. 그리고 [1,4] , [3,2], [3,2] 는 합이 5이므로 완호의 합인 4보다 크다. 그러므로 결국 완호는 4등이 된다.

 

문제에 대한 아이디어 

이 문제는 구현 문제인것 같다.

아이디어를 잘 생각해서 구현을 하면된다.

내가 생각한 아이디어는 제일 처음 점수를 입력받을 때, 근무 태도 점수를 내림차순으로 입력 받는다. 만약 근무 태도 점수가 같으면 동료 평가 점수를 오름 차순으로 받는다.

그 이유는 인센티브를 받지 못한 상대를 찾기 위해서이다.

  • 근무 태도 점수를 내림차순으로 할 경우 자신 보다 앞에 있는 것은 무조건 자신보다 점수가 낮다.
  • 동료 평가 점수를 오름 차순했으로 정렬했다. 만약 자신보다 앞에 있는 것중 자신 보다 근무 태도 점수가 높은게 있으면 인센티브를 받지 못한다.

  • 이제 2개의 합이 완호의 합보다 큰것을 찾으면 된다.

 

구현

import java.util.*;

class Node implements Comparable<Node>{
    int x; int y; 
    public Node(int x, int y){
        this.x=x;
        this.y=y;
    }
    // 근무 태도 점수는 내림차순, 동료 평가 점수는 오름 차순
    public int compareTo(Node n){
       if(this.x == n.x)
           return this.y-n.y;
        return n.x - this.x;
    }
}

class Solution {
    ArrayList<Node> score = new ArrayList<>();
    public int solution(int[][] scores) {
        int answer = 0;
        int att=0; 
        int sc=0;
        Node wanho = new Node(scores[0][0], scores[0][1]);
        score.add(wanho);
        for(int i=1; i<scores.length; ++i){
            score.add(new Node(scores[i][0], scores[i][1]));
        }
        Collections.sort(score);
        int maxScore = 0;
        for(Node n : score){
            //앞에 동료 평가 점수가 더 높은게 있는지 검사
            if(n.y < maxScore){
                if(n.equals(wanho)) {
                    answer = -1;
                    break;
                }
            }
            //없으면 동료 평가 점수 더 큰 것으로 바꿈
            else{
                maxScore = Math.max(maxScore, n.y);
                //완호 점수 합 보다 큰것이 있으면 answer 카운트
                if(n.x + n.y > wanho.x+wanho.y) ++answer;
            }
        }
        if(answer == -1) return answer;
        else return answer+1;
    }
}