문제
https://school.programmers.co.kr/learn/courses/30/lessons/152995
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 개요
이 문제는 각 사원의 근무 태도 점수와 동료 평가 점수가 주어졌을 때, 인센티브를 받을 수 있는 사원과 그들의 석차를 구하는 문제입니다. 특정 사원이 다른 사원들 중 어느 한 명이라도 두 점수 모두 낮다면 인센티브를 받지 못하며, 인센티브를 받을 수 있는 사원은 두 점수의 합에 따라 석차가 매겨집니다. 점수의 합이 동일한 사원은 동석차를 가지며, 이 석차에 따라 완호(첫 번째 사원)의 최종 석차를 구하는 것이 목표입니다.
접근 방법
- 정렬을 이용한 사원 필터링:
- 사원들을 근무 태도 점수를 기준으로 내림차순 정렬합니다. 만약 근무 태도 점수가 동일하다면 동료 평가 점수를 오름차순으로 정렬합니다.
- 정렬된 리스트를 순차적으로 탐색하면서, 동료 평가 점수가 이전에 처리한 사원의 동료 평가 점수보다 낮다면, 그 사원은 두 점수 모두 낮은 사원이므로 인센티브를 받을 수 없습니다.
- 이 과정에서 완호가 필터링된 경우, 인센티브를 받을 수 없기 때문에 바로 -1을 반환합니다.
- 석차 계산:
- 필터링된 사원들에 대해 두 점수의 합을 기준으로 다시 정렬합니다.
- 두 점수의 합이 높은 순으로 탐색하며 완호보다 높은 점수의 사원이 몇 명인지를 세어 석차를 결정합니다.
- 만약 두 점수의 합이 동일한 사원이 있을 경우, 그들은 모두 동일한 석차를 갖고, 다음 석차는 건너뜁니다.
이러한 방식으로 각 사원의 인센티브 가능 여부를 판단하고, 완호의 석차를 구할 수 있습니다.
import java.util.*;
class Solution {
public int solution(int[][] scores) {
int answer = 1;
int[] target = {scores[0][0], scores[0][1]};
Arrays.sort(scores, (o1, o2) -> {
return o1[0]==o2[0] ? o1[1] - o2[1] : o2[0] - o1[0];
});
int num = scores[0][1];
for(int i=1; i<scores.length; i++) {
if(num > scores[i][1]) {
if(scores[i][0]==target[0] && scores[i][1]==target[1]) return -1;
scores[i][0] = scores[i][1] = -1;
} else {
num = scores[i][1];
}
}
Arrays.sort(scores, (o1, o2) -> {
return (o2[0]+o2[1]) - (o1[0]+o1[1]);
});
for(int i=0; i<scores.length; i++) {
if(scores[i][0] + scores[i][1] > target[0] + target[1]) answer++;
else break;
}
return answer;
}
}
'문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 의상 - Java (0) | 2024.10.25 |
---|---|
[프로그래머스] 110 옮기기 - Java (3) | 2024.10.19 |
[프로그래머스] 거스름돈 - Java (3) | 2024.10.17 |
[프로그래머스] 가장 먼 노드 - Java (0) | 2024.10.15 |
[프로그래머스] 징검다리 건너기 - Java (2) | 2024.10.13 |