인사고과
문제 링크
풀이
예전에 풀어봤던 유형인데 틀렸다. 속상하다.
점수가 하나라도 다른 사람보다 높으면 인센티브를 받기 때문에 정렬을 사용하는 것이 확실했다. 처음에는 근무 태도
점수와 동료 평가
점수를 모두 내림차순으로 정렬했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Collections.sort(ar, (a,b) -> {
if(a[0] == b[0]) return b[1] - a[1];
return b[0] - a[0];
});
int max_a = ar.get(0)[0];
int max_b = ar.get(0)[1];
for(int i=1; i <ar.size();i++){
// 근무 태도 점수가 가장 큰 경우, 무조건 인센티브를 받음
if(max_a == ar.get(i)[0]) left.add(ar.get(i));
// 근무 태도 점수가 적은 경우, 자신의 동료 평가 점수가 이전에 나온 동료 평가의 최댓값보다
// 크거나 같으면 인센티브를 받는 목록에 포함
if(max_b <= ar.get(i)[1]){
left.add(ar.get(i));
max_b = ar.get(i)[1];
}
}
위 경우 큰 오류가 있다. 다음 예시를 보자.
1
2
3
4
ar = { {2, 1}, {2, 2}, {2, 3}, {3, 1} };
// 정렬 결과 : {3, 1}, {2, 3}, {2, 2}, {2, 1}
// 실제 인센티브를 받아야하는 사람 목록 : {3, 1}, {2, 3}, {2, 2}, {2, 1}
// 나의 경우 : {3, 1}, {2, 3}
내 경우에는 {2,2}, {2,1}
은 제외된다. 두 번째 조건을 내림차 순으로 정렬했기 때문에 근무 태도는 작지만 동료 평가는 높은 경우를 제외해버렸다.
더 면밀히 말하자면, 자신보다 근무 태도 점수가 높은 사람들의 동료 평가 점수 중 최댓값보다 자신의 동료 평가 점수가 높은 경우를 제외했다. 동료 평가 점수도 내림차순으로 정렬하여, 자신과 근무 태도 점수는 같은데 동료 평가 점수가 높은 사람이 먼저 왔기 때문이다.
따라서 정렬을 할 때, 근무 태도가 높은 사람은 우선 내림차순 정렬하고 같은 경우, 동료 평가 점수는 오름차순으로 정렬하면 된다.
1
2
3
4
5
6
Collections.sort(ar, (a,b) -> {
if(a[0] == b[0]) return a[1] - b[1];
return b[0] - a[0];
});
// 정렬 결과 : {3, 1}, {2, 1}, {2, 2}, {2, 3}
이렇게 정렬을 하면 인센티브를 받을 수 있는 사람을 올바르게 찾을 수 있다. 최종 제출할 때는 최대한 코드를 간결하게 수정하여 제출했다.
전체 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.*;
class Solution {
public int solution(int[][] scores) {
int answer = 1;
int[] wanho = scores[0].clone();
Arrays.sort(scores, (a,b) -> a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]);
int max = scores[0][1];
for(int[] score : scores){
if(wanho[0] < score[0] && wanho[1] < score[1]) return -1;
if(score[1] >= max){
max = score[1];
if(score[1] + score[0] > wanho[1] + wanho[0]) answer+=1;
}
}
return answer;
}
}
This post is licensed under CC BY 4.0 by the author.