직원들의, 근무태도와 동료평가 두 점수가 주어진다.
자기 자신보다 근무태도와 동료평가 두 점수 둘 다 높은 경우가 있다면 해당 직원은 인센티브를 못 받는다.
인센 못받는 직원을 제외해서
근무태도 + 동료평가 가 높은 순으로 등수를 매기는데 동점인 사람들은 같은 등수를 받게 된다.
하지만 1등이 3명이라면 다음 등수는 2등이 아니라 4등부터 시작한다.
정렬을 두 번 해준다.
첫 번째 정렬은 근무태도는 내림차순으로, 근무태도 점수가 같다면 동료평가는 오름차순으로 정렬한다.
scores 배열을 탐색하면서 전의 직원의 동료평가 점수보다 지금 직원의 동료평가 점수가 낮다면 해당 직원은 인센티브를 받을 수 없다. 해당 직원의 점수를 음수로 다 바꿔준다.
만약에 완호 점수가 이에 해당된다면 answer를 -1로 해준뒤 두 번째 정렬은 수행하지 않는다.
두 번째 정렬은 근무태도 + 동료평가 합을 기준으로 내림차순 해준다. (인센티브를 못받는 직원들은 두 점수가 다 음수로 바뀌었으니 제일 뒷단으로 가게 된다)
배열을 탐색하면서 완호 점수의 index + 1의 값을 출력하면 된다.
import java.util.*;
class Solution {
public int solution(int[][] scores) {
int answer = 0;
int wanhoAtt = scores[0][0];
int wanhoPeer = scores[0][1];
Arrays.sort(scores, (o1, o2) -> o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0]);
int k = scores[0][1];
for(int[] score : scores){
if(k > score[1]){
if(wanhoAtt == score[0] && wanhoPeer == score[1]) {
answer = -1;
break;
}
score[0] = -1;
score[1] = -1;
}else{
k = score[1];
}
}
if(answer != -1){
Arrays.sort(scores, (o1, o2) -> o2[0] + o2[1] - o1[0] - o1[1]);
for(int i = 0; i < scores.length; i++){
if(wanhoAtt == scores[i][0] && wanhoPeer == scores[i][1]){
answer = i + 1;
break;
}
}
}
return answer;
}
}
처음에는 두 점수 둘 다 오름차순으로 해준 뒤 이분탐색으로 자기 보다 높은 점수를 가진 직원있는지를 찾으려 했다. 물론 이분 탐색으로도 시간초과가 안날것이지만, 이 문제는 이렇게 정렬을 잘 활용해서 푸는게 좀 더 맞게 푸는 방법 같다.