문제 정의
근무 태도 점수, 동료 평가 점수가 주어졌을 때,
두 점수 중 한 점수라도 다른 사원과 비교했을 때 높거나 같은 사원들만을 뽑고,
두 점수의 합으로 석차를 매겼을 때, 완호의 석차가 몇인지 구하는 문제
문제 조건
- 임의 사원과 비교했을 때, 두 점수가 모두 낮다면 해당 사원은 제외
- 두 점수의 합이 같을 경우, 동석차 -> 다음 석차는 건너뜀
문제 접근 방법
- 인센티브를 받을 수 있는 후보들만을 저장할 리스트를 만든다.
- 주어진
scores
배열을 정렬하여, 조건에 맞는 값들만을 리스트에 추가한다. - 추가한 리스트를 점수의 합으로 내림차순 정렬한다.
- 리스트를 1번째부터 순회하면서, 완호의 석차가 몇인지 구한다.
- 0번째에 있을 수 있으니, 다시 한 번 확인한다.(이전에, 완호가 후보에 속하지 않을 수도 있으니,
answer=-1
로 초기화해뒀다.)
잘못된 접근
- 두 점수를 모두 내림차순으로 정렬해서 문제의 답이 나오지 않았다.
해결 방법
- 근무 태도 점수는 내림차순, 동료 평가 점수는 오름차순으로 정렬한다.
- 그리고 이전 동료들의 점수 중에서 가장 큰 동료 평가 점수를
maxPeerScore
로 저장하여 현재 점수가maxPeerScore
보다 크다면, 후보가 되는 것으로 리스트에 추가한다. - 그 이후 접근 방법은 동일하다.
import java.util.*;
class Solution {
public int solution(int[][] scores){
int answer = -1;
int[] target = scores[0];
int N = scores.length;
Arrays.sort(scores, (o1, o2) -> {
if(o2[0] == o1[0]) return o1[1] - o2[1];
return o2[0] - o1[0];
});
int maxPeerScore = -1;
ArrayList<int[]> candi = new ArrayList<>();
for(int i=0; i<N; ++i){
if(i==0 || ( maxPeerScore <= scores[i][1])){
maxPeerScore =Math.max(maxPeerScore, scores[i][1]);
candi.add(scores[i]);
}
}
Collections.sort(candi, new Comparator<int[]>() {
@Override
public int compare(int[] a, int[] b) {
return Integer.compare(b[0] + b[1], a[0] + a[1]);
}
});
int rank = 1;
for(int i=1; i<candi.size(); ++i){
int[] cur = candi.get(i);
int[] prev = candi.get(i-1);
if(((prev[0]+prev[1]) == (cur[0]+cur[1]))){
rank = rank;
}else{
rank = i+1;
}
if(Arrays.equals(target, cur)){
answer = rank;
break;
}
}
if(Arrays.equals(target, candi.get(0))){
answer = 1;
}
return answer;
}
}
'코딩테스트(Coding Test) > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 괄호 회전하기 (1) | 2024.02.10 |
---|---|
[프로그래머스.SQL] GROUP BY (0) | 2023.11.24 |
[프로그래머스.SQL] SUM, MAX, MIN (0) | 2023.11.24 |
[프로그래머스/SQL] 오프라인/온라인 판매 데이터 통합하기 (0) | 2023.10.17 |