오늘 푼 문제
3. H-Index / Lv.2 / 시간 : 52분 (타임 오버)
programmers.co.kr/learn/courses/30/lessons/42747?language=javascript
function solution(citations) {
var answer = 0;
let arr = citations.sort((a,b) => a-b);
let n = citations.length;
if(arr[0] > n) return n;
let pos = n-1;
while(arr[pos] > n-pos){
pos--
}
let temp = arr[pos];
let left = n-pos;
while(temp<left-1){
temp++
}
answer = temp
return answer;
}
헤맸던 부분
1. 정답 h는 citations 배열의 원소 값이 아니어도 된다.
2. 최소 인용 횟수가 논문 전체의 편수보다 크다면 h는 논문 전체 편수가 된다.
다른 사람의 풀이
function solution(citations) {
var answer = 0;
citations.sort((a, b) => b - a);
for(let i = 0; i < citations.length; i++) {
if(citations[i] > i) answer++;
else break;
}
return answer;
}
내림차순 정렬 후 해당 배열의 인덱스보다 배열의 값(인용 횟수)이 더 큰 경우를 모두 카운트하면 정답이 나온다.
왜지? 이해 못 함
유레카!
h-index의 이해를 돕기 위한 추가 설명 참조
www.ibric.org/myboard/read.php?Board=news&id=270333
해당 글을 보면 h-지수를 구하는 방법을 다음과 같이 설명한다.
자신이 저널에 등재한 전체 논문중 많이 인용된 순으로 정렬한 후, 피인용수가 논문수와 같아지거나 피인용수가 논문수보다 작아지기 시작하는 숫자가 바로 나의 h가 됩니다.
즉, 내림차순으로 정렬한 다음 배열을 살펴보면
인덱스 i 와 값 h는 곧
'h번 이상 인용된 논문의 편수가 (i+1)편'
임을 의미한다.
ex) [33,12,5,3] 으로 정렬된 배열에서
33번 이상 인용된 논문은 [33], 총 1편 ( i+1= 0+1 = 1),
12번 이상 인용된 논문은 [33, 12], 총 2편 ( i+1= 1+1 = 2),
5번 이상 인용된 논문은 [33, 12, 5], 총 3편 ( i+1= 2+1 = 3),
3번 이상 인용된 논문은 [33, 12, 5, 3], 총 4편 ( i+1= 3+1 = 4)
따라서 인용횟수 h가 논문편수 i를 넘지 않는 범위 내에서의 i를 하나씩 증가시켜 가면서 값을 비교하면 h의 최댓값을 구할 수 있다.
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 고득점 키트 - 해시2 (0) | 2020.10.22 |
---|---|
[프로그래머스] 고득점 키트 - 해시1 (0) | 2020.10.12 |
[프로그래머스] 고득점 키트 - 정렬1,2 (0) | 2020.09.19 |
[해커랭크] 알고리즘을 최적화 해보자 Array Manipulation (0) | 2020.09.14 |
[해커랭크] 알고리즘을 최적화 해보자 Ransom Note (0) | 2020.09.11 |