🖊️ 문제
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.
제한사항
- 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
- 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.
🖥️ 코드
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> citations)
{
sort(citations.begin(), citations.end(), greater<int>());
for(int idx = 0; idx < citations.size(); idx++)
if(idx + 1 > citations[idx])
return idx;
return citations.size();
}
🤔 나의 생각
H번 이상 인용된 논문이 H편 이상인데 그 H의 최댓값을 구하는 문제다!이다. 근데... 처음 읽으면 되게 헷갈린다.
두 가지를 기억하면 헷갈리지 않고 문제를 해결할 수 있다.
- H의 값은 0 ~ 논문의 수이다.
- A 교수는 다섯 개의 논문을 발표했는데 아쉽게도 다섯 개 모두 0회 인용되었다. [0, 0, 0, 0, 0]
0번 이상 인용된 논문이 0편 이상이므로 A 교수의 H-Index는 0이다. 즉, 논문을 발표하기만 하면 기본 H-Index는 0이다. - 반면 논문의 인용 횟수가 [10, 10, 10, 10, 10]라면 H-Index는 5이다.
- A 교수는 다섯 개의 논문을 발표했는데 아쉽게도 다섯 개 모두 0회 인용되었다. [0, 0, 0, 0, 0]
- H는 citations의 원소가 아니다.
- B 교수는 네 개의 논문을 발표했는데 각 논문이 [30, 55, 20, 100]회 인용되었다.
4번 이상 인용된 논문이 4편 이상이므로 B 교수의 H-Index는 4이다.
- B 교수는 네 개의 논문을 발표했는데 각 논문이 [30, 55, 20, 100]회 인용되었다.
다시 문제로 돌아와서 인용 횟수를 내림차순을 정렬하고, idx를 0부터 논문의 수만큼 증가시킬 때 idx + 1이 citations[idx]보다 작거나 같다면 우린 두 가지 단계로 정답을 이해할 수 있다.
- citations[idx]는 idx+1회 이상 인용되었다.
- idx+1회 이상 인용된 논문이 현재까지 idx+1개 있다.
- 문제에서 요구하는 H-Index를 구하는 공식이 바로 여기 있다!
생각해 보니 위 설명과 비슷한 코드는 아래와 더 가깝다.
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> citations)
{
int answer = 0;
sort(citations.begin(), citations.end(), greater<int>());
for(int idx = 0; idx < citations.size(); idx++)
if(idx+1 <= citations[idx]) answer = idx+1;
else break;
return answer;
}
'Algorithm > 프로그래머스 : Level 2' 카테고리의 다른 글
[프로그래머스 Level 2] 프렌즈4블록 (2018 카카오 기출) (0) | 2021.11.21 |
---|---|
[프로그래머스 Level 2] 피로도 (0) | 2021.11.21 |
[프로그래머스 Level 2] 큰 수 만들기 (0) | 2021.11.19 |
[프로그래머스 Level 2] 다리를 지나는 트럭 (두 가지 풀이) (0) | 2021.11.19 |
[프로그래머스 Level 2] 카펫 (0) | 2021.11.18 |