본문으로 바로가기

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

 

프로그래머스

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

programmers.co.kr

 

 

문제 설명

근무 태도, 동료 점수 가 주어졌을 때 

임의의 팀원보다 두 점수가 모두 낮은 사람은 인센티브를 받지 못하고 

인센티브 지급 대상자들 사이에서 두 점수의 총합에 따라 등수를 정했을 때, 완호의 등수를 출력하는 문제

 


풀이 

1. 근무 태도와 동료 점수를 바탕으로 인센티브를 아예 받지 못하는 사람을 체크해야 한다. 

여기서 정렬이 사용되는데, 

 

근무 태도의 내림차순 , 동료 점수의 오름차순 으로 정렬하면 

반복문 수행 시 근무태도는 어차피 이전 팀원보다 낮거나 같기 (같은 경우, 당연히 동료 점수는 오름차순이기 때문에 제외되지 않는다)

때문에 동료 점수가 낮은지 높은지 체크하면 제외 대상을 뽑을 수 있다. 

 

단 동료 점수가 오름차순으로 되어 있기 때문에 현재 대상자가 제외되지 않는다면 동료 점수의 임계값을 재설정해주어야 한다. 

 

 

2. 완호가 인센티브 대상자에 포함되어 있을 경우,

두 점수의 합산으로 재 정렬 후 완호보다 높은 사람의 숫자만 체크해주면 완호의 등수를 확인할 수 있다. 

 

 


전체 코드 

import java.util.Arrays;

class Solution {
    public int solution(int[][] scores) {
        int answer = 0;
        int size = scores.length;
        int n = scores[0][0];
        int m = scores[0][1];
        
        Arrays.sort(scores, (o1, o2) -> {
            if (o1[0] == o2[0]) {
                return o1[1] - o2[1];
            }
            return o2[0] - o1[0];
        });
        
        // 어차피 근무 태도는 내림차순으로 정렬되어 있으므로 동료 점수만 비교하면 됨
        int maxScore = scores[0][1];
        
        for(int i = 1; i<size; i++) {
           if (scores[i][1] < maxScore) { // 인센티브를 받지 못하는 경우
               if (scores[i][0] == n && scores[i][1] == m) // 완호 점수인 경우
                   return -1;
               
               scores[i][0] = -1;
               scores[i][1] = -1;
           } else {
                maxScore = scores[i][1];
           }
        }
        
        // Step 2
        Arrays.sort(scores, (o1, o2) -> (o2[0] + o2[1]) - (o1[0] + o1[1]));
        
        answer = 1;
        
        // 완호보다 높은지만 체크하면 등수가 나온다
        for(int i = 0; i<size; i++) {
            if (scores[i][0] + scores[i][1] > n + m) {
                answer ++;
            } else {
                break;
            }
        }
        
        return answer;
    }
}