function solution(citations) {
let answer = 0;
citations.sort((a, b) => a - b);
console.log(citations)
for (let i = 1; i < citations.length; i++ ) {
if (citations[i] <= citations.slice(i).length) {
answer = citations[i];
}
else {
break;
}
}
return answer;
}
우선 그냥 sort를 하면 숫자의 경우 제대로 되지 않기 때문에 b - a
혹은 a - b
를 추가하여 정렬해주어야 한다.
이 문제를 처음 풀었을 때 오름차순으로 정렬한 후, slice를 이용해 해당 인덱스를 기준으로 arr.slice(i).length
이렇게 길이를 구한 후 비교를 해서 풀었는데 답이 왜????안나왔는지 이해를 못했다.
그래서 결국 다른 분들의 풀이를 살짝 참고해서 내림차순으로 정렬한 후 다시 풀어보았다.
function solution(citations) {
citations.sort((a, b) => b - a);
let answer = 0;
while (answer + 1 <= citations[answer]) {
answer += 1
}
return answer;
}
그리고 키포인트!!!!!
발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상
이 부분을 잘 읽고 머리를 잘 굴려보면..
발표한 논문을 내림차순으로 정렬했을 때, 인덱스의 값이 자신보다 큰 수의 갯수라는 것을 알 수 있다 !!!!!!!!!!!
예를 들면 citations이 [3, 0, 6, 1, 5] 일 때, 내림차순으로 정렬하면 [6, 5, 3, 1, 0]이 된다.
순서대로 인덱스가 0, 1, 2, 3, 4일 때 6보다 큰 수는 0개, 5보다 큰 수는 1개, ... 0보다 큰 수는 4개 이렇게 인덱스와 자신보다 큰 수의 갯수가 같다는 것을 알 수 있다.
또한 정렬했기 때문에 나머지 논문이 h번 이하 인용되었다는 것은 당연하기 때문에 이를 이용해서 문제를 풀면 된다.
h편 이상이기 때문에 자신도 포함하여 answer + 1 <= citations[answer]
을 조건으로 반복문을 돌리면 된다. 이 조건에 만족하지 않을 경우, 최댓값을 구하는 것이기 때문에 멈추고 answer를 출력하면 된다.