본문 바로가기

알고리즘 문제풀이

[프로그래머스] 인사고과 Lv.3 (Java)

 

프로그래머스

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

programmers.co.kr

조건

1. 근무태도 점수 + 동료 평가 점수가 주어진다.

2. 다른 임의 사원보다 두 점수가 모두 낮은 경우가 한번이라도 있다면 인센티브를 받을 수 없음

3. 그외에는 두 점수의 합이 높은 순으로 석차를 내어 인센티브 차등지급

4. 두 점수의 합이 동일한 경우 동석차이며, 동석차의 수만큼 다음 석차는 건너 뜀

입력

  • 1 ≤ scores의 길이 ≤ 100,000
  • scores의 각 행은 한 사원의 근무 태도 점수와 동료 평가 점수를 나타내며 [a, b] 형태
    • scores[0]은 완호의 점수
    • 0 ≤ a, b ≤ 100,000

문제 해결 프로세스

  1. a(근무태도 점수)를 기준으로 내림차순
  2. a의 점수가 같다면 b(동료평가 점수)를 기준으로 오름차순 -> 정렬하게 되면 a는 신경쓰지 않아도 되고, b의 값이 이전보다 작을 경우 인센티브를 받지 못함
  3. 정렬된 배열을 순차적으로 돌며 b의 가장 큰 값을 탐색하여 인센티브를 받지 못하는 경우를 검색

코드

import java.util.*;

class Solution {
    public int solution(int[][] scores) {
        int[] wanhoScore = scores[0];
        int rank = 1;
        int maxScore = 0;
        int wTotal = wanhoScore[0] + wanhoScore[1];
            
        Arrays.sort(scores, (a, b) -> a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]);  // 배열 정렬
        
        for(int[] score : scores) {
            if(maxScore <= score[1]) {
                maxScore = score[1];
                if(score[0] + score[1] > wTotal) rank++;  // 완호 점수보다 큰 경우 랭크 증가
            } else {
                if(score.equals(wanhoScore)) return -1;
            }
        }
        return rank;
    }
}

정리

배열을 어떻게 정렬하고 탐색하느냐가 관건이다. 문제의 정답은 완호의 랭크만 출력하는 것이므로 완호의 정보를 미리 저장해놓고 비교하며 랭크를 찾는다.