https://school.programmers.co.kr/learn/courses/30/lessons/152995
문제 설명
근무 태도, 동료 점수 가 주어졌을 때
임의의 팀원보다 두 점수가 모두 낮은 사람은 인센티브를 받지 못하고
인센티브 지급 대상자들 사이에서 두 점수의 총합에 따라 등수를 정했을 때, 완호의 등수를 출력하는 문제
풀이
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;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 2023 KAKAO BLIND - 택배 배달과 수거하기 (자바) (0) | 2023.04.17 |
---|---|
[프로그래머스] 연속된 부분 수열의 합 (자바) (1) | 2023.04.13 |
[프로그래머스] 연속 펄스 부분 수열의 합 (자바) (0) | 2023.04.12 |
[프로그래머스] 무인도 여행 (Java) (0) | 2023.03.23 |
[프로그래머스] 호텔 대실 (Java) (0) | 2023.03.20 |