문제
문제 설명
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회 이하입니다.
문제 요약
이 문제는 요약 할 게 없이 문제 그대로 해석하면 될 것 같습니다.
문제 풀이
위 문제를 읽고 어떤 식으로 풀어야하지 먼저 생각을 해보았지만 너무 헷갈렸습니다. ~이상, ~이하 나머지... 그래서 예시를 하나씩 전부 나열해보았어요. 위 문제에 나온 테스트케이스를 하나씩 쓰면서 생각해보면 아래와 같습니다.
[6,3,0,1,5]
5번 이상 인용된 논문 : 2편 > 5 (x)
4번 이상 인용된 논문 : 2편 > 4 (x)
3번 이상 인용된 논문 : 3편 > 3 (o)
2번 이상 인용된 논문 : 3편 > 2 (o)
1번 이상 인용된 논문 : 4편 > 1 (o)
0번 이상 인용된 논문 : 5편 > 0 (o)
위와 같이 쓰게 된다면 바로 규칙이 보여요. H-Index를 기점으로 위는 x, 아래는 o 하지만 이를 안다고해서 코드가 쉽게 써내려지지 않았어요.. 계속 고민해보면서 뭐가 헷갈리는 건지 생각해보았는데.. 결국, 질문하기에 나와있는 질문들을 보면서 무엇이 헷갈렸던건지 알아낼 수 있었습니다. 바로 H-Index는 논문의 개수 중 하나라는 점을 파악하지 못하여 푸는데 한~~참 걸렸습니다.
위 예제에서 총 논문의 수는 5개입니다. 그래서 h번 이상, h번 이하로 판단 가능한 h의 범위는 0 <= h <= 5라고 할 수 있어요. H-Index는 논문의 수에서 고르는 것이고, 비교대상은 인용된 논문의 빈번도입니다!
문제를 이해했다면 아래와 같이 알고리즘을 짤 수 있을 것 같습니다. 정렬방식을 이용했는데 배열의 index와 논문의 개수가 동일해서 사용할 수 있었습니다. (너무 당연한 이야기지만)
1. citations 오름차순으로 정렬
2. 논문의 index번호를 하나씩 올리며 논문의 빈번도와 index번호(논문의 개수)를 비교하여 논문의 개수가 크거나 같다면 멈춘다.
코드
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int solution(vector<int> citations) {
int answer = 0;
sort(citations.begin(), citations.end());
for (int i = citations.size()-1; i >= 0; i--) {
if (answer >= citations[i]) {
break;
}
answer++;
}
return answer;
}
실제로 논문에는 H-Index표기법을 사용하고 있다고 하네요. 저도 위 풀이법을 H-Index표기법에 대한 자세한 이야기를 읽고 생각해내었습니다. 여기 에서 참고했습니다. 휴💦
'Algorithm' 카테고리의 다른 글
[Programmers] 스킬트리 (0) | 2021.04.25 |
---|---|
[Baekjoon] Contact (feat. 정규표현식) (0) | 2021.04.11 |
[Programmers] 구명보트 (0) | 2021.03.23 |
[Programmers] K번째수 (0) | 2021.03.11 |
[Programmers] 완주하지 못한 선수 (0) | 2021.03.10 |