https://school.programmers.co.kr/learn/courses/30/lessons/42747?itm_content=course14743
문제 설명
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다.
어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다.
위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고
나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때,
이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.
제한사항
과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
논문별 인용 횟수는 0회 이상 10,000회 이하입니다.
[ 첫번째 문제 풀이 ] -> 문제생김
function solution(citations) {
let count = 0;
let countByItems = {};
citations.sort((a, b) => a - b);
//1. h번을 순차적으로 h번이상 인용된 논문 수 구하기
citations.forEach((items,index) => {
citations.forEach((item) => {
if (index <= item) {
++count;
}
});
countByItems[index] = count;
count = 0;
});
const filteredArr =[] ;
for ( key in countByItems) {
const value = countByItems[key];
if (key == value) {
filteredArr.push(key)
}
}
//4. newArr 첫번째 값 반환
return Number(filteredArr[0]);
}
아마 [0,0,0]의 경우 null나 와서 그런듯
정렬된 배열 [0, 0, 0]의 모든 요소는 0이므로 인용된 횟수도 항상 0으로 계산됨
그 결과, countByItems 객체에는 모든 키에 대한 값이 0으로 설정되고,
filteredArr도 비어 있는 상태가 되어 첫 번째 값을 반환할 때 null이 반환됨
다시 생각해보자
[두번째 문제 풀이]
function solution(citations) {
let count = 0;
let countByItems = {};
citations.sort((a, b) => b - a);
//1. h번을 순차적으로 h번이상 인용된 논문 수 구하기
citations.forEach((citation, index) => {
if (citation >= index + 1) {
count++;
}
countByItems[index + 1] = count;
});
console.log(countByItems);
// 2. 최대 h 찾기
let h = 0;
for (let i = 1; i <= citations.length; i++) {
if (countByItems[i] >= i) {
h = i;
}
}
return h;
}
일단 오름차순 말고 내림차순으로
citations.sort((a, b) => b - a);
왜?
이 때, H번 이상 인용된 논문들을 내림차순으로 정렬하면, H번 이상 인용된 논문들이 앞쪽에 위치함
내림차순으로 정렬된 논문에서 H번 이상 인용된 논문이 H편 이상이 되는 첫 번째 H 값을 찾으면,
그 값이 Hirsch 지수가 된다. 이렇게 정렬하면 H-Index를 더 쉽게 계산할 수 있음
for in 반복문은 객체에 주로 사용합니다.
'프론트엔드로 가는 길 > 프로그래머스' 카테고리의 다른 글
Hash : 의상 (1) | 2023.11.22 |
---|---|
61. 여행경로 (0) | 2023.09.17 |
59. k진수에서 소수 개수 구하기 - 2022 KAKAO BLIND RECRUITMENT (0) | 2023.09.14 |
58. 체육복 (0) | 2023.09.14 |
57. 문자열 다루기 기본 (0) | 2023.09.12 |