문제
완호네 회사는 연말마다 1년 간의 인사고과에 따라 인센티브를 지급합니다. 각 사원마다 근무 태도 점수와 동료 평가 점수가 기록되어 있는데 만약 어떤 사원이 다른 임의의 사원보다 두 점수가 모두 낮은 경우가 한 번이라도 있다면 그 사원은 인센티브를 받지 못합니다. 그렇지 않은 사원들에 대해서는 두 점수의 합이 높은 순으로 석차를 내어 석차에 따라 인센티브가 차등 지급됩니다. 이때, 두 점수의 합이 동일한 사원들은 동석차이며, 동석차의 수만큼 다음 석차는 건너 뜁니다. 예를 들어 점수의 합이 가장 큰 사원이 2명이라면 1등이 2명이고 2등 없이 다음 석차는 3등부터입니다.
각 사원의 근무 태도 점수와 동료 평가 점수 목록 scores이 주어졌을 때, 완호의 석차를 return 하도록 solution 함수를 완성해주세요.
접근법
거의 2시간 걸려서 풀었는데... 생각보다 단순한 듯 하면서도 어려운 문제인듯
구해야 하는 건 1. 각 사원들이 인센티브를 받을 수 있는지 ? 2. 받을 수 있다면 -> 완호의 석차(등수)를 구하는 문제
- 인센을 받을 수 있는지 ?
- 이 경우에 완호가 인센을 받는지 뿐만 아니라 각 사원들이 인센을 받을 수 있는지도 조사해야 함(인센을 못 받는다면 등수에서 제외되기 때문에)
- 이중 반복문으로 모든 사원들과 비교해보면 최대 10^5^2까지 반복되기 때문에, 정렬을 하거나 해서 줄여야 함
- 완호의 석차
- 동석차 개념이 나오기 때문에 헷갈릴 수 있는데, 사실 여기서 동석차가 중요한건 아님
- 예를 들어 완호보다 점수가 높은 사람이 3명이 있을 때 , 3명의 순위가 어떻게 나오던 간에 완호는 무조건 4등이 됨
- 완호랑 똑같은 점수인 사람들도 상관 없음(이 사람들도 다 4등)
- 그러면 전체 scores에서 인센을 받을 수 있는지를 조사한 후 못받는 사람들 제거하고, 완호가 받을 수 있다면 완호보다 점수가 높은 사람들이 몇명인지만 구해서 거기에 +1을 해주면 되는줄 알았지만
- 시간 초과 엔딩...
- 여기서 생각해보면 합이 10인 사람과 합이 9인 사람을 비교해보면 무슨 수를 써도 10인 사람은 9인 사람보다 두 점수 모두 낮을 수 없음
- 그렇다면 이중 반복문으로 모두 비교할 필요도 없이, 완호보다 점수가 높은 사람들만 거른 다음, 이 사람들끼리 비교해서 점수 낮은 사람 -> 높은 사람만 비교해서 인센을 못 받을 경우 제외시켜주면 됨
코드
function solution(scores) {
const 내점수 = scores.shift()
const sum = 내점수[0] + 내점수[1]
//합이 완호보다 작으면, 완호를 인센티브 못받게 할 수 없음
const filter = scores.filter(([a,b]) => a+b > sum)//원호보다 큰 값들만
let noIncentive = false
filter.forEach(([a,b]) => {
if(a > 내점수[0] && b > 내점수[1]){
noIncentive = true
}
})//완호가 인센티브 받을 수 있는지
if(noIncentive ){return -1}
//완호보다 큰 값들 중에서 인센티브 못받는 사원 제거
let count = 0
filter.sort((a,b) => a[0]+a[1] - (b[0] + b[1]))
for(let i=0;i<filter.length;i++){
const [a,b] = filter[i]//이 값이 인센티브 받을 수 있는지 조사
for(let j=i+1;j<filter.length;j++){
const [x,y] = filter[j]
if(a < x && b < y){
count += 1
break
}
}
}
return filter.length+1 - count
}
완호보다 합이 큰 값들만 filter로 거른 후 , 합에 따라 오름차순 정렬한 다음 ,
작은 값 -> 큰 값을 비교해서 인센을 못 받는다면 count ++ 해주고
filter.length - count + 1한 값이 정답
'JS' 카테고리의 다른 글
import한 함수 에러 처리법 (0) | 2023.07.22 |
---|---|
프로그래머스 - 보석 쇼핑 JS (0) | 2023.07.17 |
프로그래머스 - 큰 수 만들기 JS (0) | 2023.07.12 |
프로그래머스 - 셔틀버스 JS (0) | 2023.06.30 |
다크모드 감지해서 적용하는 법 (0) | 2023.06.09 |