728x90
문제 설명
연말 인사고과에 따라 인센티브를 지급하는 회사에서, 각 사원의 근무 태도 점수와 동료 평가 점수를 바탕으로 석차를 계산합니다.
- 어떤 사원이 다른 사원에 비해 두 점수 모두 낮다면, 그 사원은 인센티브를 받을 수 없습니다.
- 인센티브 대상인 사원들의 경우, 두 점수의 합으로 석차를 결정하며, 동점인 경우 같은 석차로 처리합니다.
- 주어진 점수 목록에서 완호의 석차를 계산하여 반환합니다.
- 만약 완호가 인센티브를 받지 못하는 경우 -1을 반환합니다.
제한 사항
- 1 ≤ scores의 길이 ≤ 100,000
- scores의 각 행은 [a, b] 형태로, 근무 태도 점수 a와 동료 평가 점수 b를 나타냅니다.
- scores[0]은 완호의 점수입니다.
- 0 ≤ a, b ≤ 100,000
- 결과적으로 완호가 인센티브를 받지 못하는 경우 -1을 반환해야 합니다.
해결 방법
알고리즘: 정렬 및 그리디
- 사전 정렬
- 근무 태도 점수(a)를 기준으로 내림차순 정렬합니다.
- 같은 점수일 경우 동료 평가 점수(b)를 기준으로 오름차순 정렬합니다.
- 이를 통해 특정 사원의 점수가 다른 사원보다 모두 낮은지를 효율적으로 검증할 수 있습니다.
- 인센티브 대상 검증
- 순회하면서 현재까지의 최대 동료 평가 점수를 저장합니다.
- 만약 현재 사원의 동료 평가 점수가 이 최대값보다 작다면, 해당 사원은 인센티브를 받을 수 없습니다.
- 이 과정에서 완호가 인센티브 대상에서 제외되는 경우 바로 -1을 반환합니다.
- 완호의 석차 계산
- 유효한 점수(인센티브 대상)의 합을 계산하여 리스트에 저장합니다.
- 이 합을 기준으로 내림차순 정렬 후, 완호의 점수 합과 일치하는 지점에서 석차를 반환합니다.
시간 복잡도
- 정렬: O(nlogn)
- scores를 조건에 따라 정렬하는 데 소요됩니다.
- 검증 및 석차 계산: O(n)
- 리스트를 순회하며 인센티브 대상을 검증하고, 석차를 계산합니다.
총 시간 복잡도: O(nlogn)
구현 코드
function solution(scores) {
const userScore = scores[0];
const userSum = userScore[0] + userScore[1];
let maxPeer = 0;
let answer = 1;
scores.sort((a, b) => b[0] - a[0] || a[1] - b[1]);
const validScores = [];
for (const [attitude, peer] of scores) {
if (peer < maxPeer) {
if (attitude === userScore[0] && peer === userScore[1]) {
return -1;
}
} else {
maxPeer = Math.max(maxPeer, peer);
validScores.push(attitude + peer);
}
}
validScores.sort((a, b) => b - a);
for (const sum of validScores) {
if (sum === userSum) break;
++answer;
}
return answer;
}
'알고리즘' 카테고리의 다른 글
[Javascript] 프로그래머스 - 에어컨 (0) | 2025.01.24 |
---|---|
[Javascript] 프로그래머스 - 부대복귀 (1) | 2025.01.22 |
[Javascript] 프로그래머스 - 연속 펄스 부분 수열의 합 (1) | 2025.01.20 |
[Javascript] 프로그래머스 - 광물 캐기 (1) | 2025.01.16 |
[Javascript] 프로그래머스 - 빛의 경로 사이클 (0) | 2025.01.15 |