알고리즘

[프로그래머스] H-Index

staktree 2023. 12. 5. 15:12

https://school.programmers.co.kr/learn/courses/30/lessons/42747

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

문제 및 예시 : 

 

 

 

해결 : 

이진탐색을 활용하여 해결할 수 있는 문제이다.

논문의 수의 범위인 1 ~ citations.size() 사이의 수들의 H-Index 가능 여부를 체크하여, 그 중 가장 큰 값을 정답으로 리턴하면 된다. 

가장 먼저 할 일은 오름차순으로 정렬하는 일이다.  H-Index 가능 여부를 체크하는 수보다 큰 수 중 가장 작은 값을 찾는 과정을 통해 H-Index 가능 여부를 체크하는 수보다 인용횟수가 적은 논문들의 개수를 구한다. 반대로 H-Index 가능 여부를 체크하는 수보다 작은 수  중 가장 큰 값을 찾는 과정을 통해 H-Index 가능 여부를 체크하는 수보다 인용횟수가 많은 논문들의 개수를 구한다.

 

개수를 구하는 과정에서 이진 탐색을 활용한다. 이진 탐색으로 원소를 탐색하는 lower_bound(), upper_bound() 함수를 사용하였다.

lower_bound(A.begin(), A.end(), key)는 오름차순 정렬된 A 배열에서 key와 작거나 작은 수 중 가장 작은 수의 인덱스를 반환한다. 

upper_bound(B.begin(), B.end(), key)는 오름차순 정렬된 B 배열에서 key보다 큰 수 중 가장 작은 수의 인덱스를 반환한다.

 

H-Index 가능 여부를 체크하는 수보다 인용횟수가 적은 논문과  H-Index 가능 여부를 체크하는 수보다 인용횟수가 많은 논문의 갯수를 

H-Index의 조건에 넣어 가능 여부를 확인하고, 가능하다면 그 값들 중 최댓값을 구하여 출력한다. 

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int answer = 0;
vector<int> cs;

int solution(vector<int> citations) {
    cs = citations;
    sort(cs.begin(), cs.end());
    
    for(int i = 1; i <= cs.size(); i++)
    {
        int upb = upper_bound(cs.begin(), cs.end(), i) - cs.begin();  
        int lb = lower_bound(cs.begin(), cs.end(), i) - cs.begin();
        int notcnt = upb; // 인용된 횟수가 i 이하인 갯수
        int hcnt = cs.size() - lb; // 인용된 횟수가 i 이상인 갯수
        if(cs[lb] == i) hcnt++; // 만약 lower_bound로 찾은 인덱스 값이 i면 인용된 횟수가 i이상인 갯수에 1을 더한다.
        if(notcnt <= i && hcnt >= i) answer = max(answer, i); 
    }
    return answer;
}

 

 

 

참고 : 

lower_bound와 upper_bound에 대한 글

https://chanhuiseok.github.io/posts/algo-55/

 

알고리즘 - c++ lower_bound, upper_bound 활용하기

컴퓨터/IT/알고리즘 정리 블로그

chanhuiseok.github.io

 

'알고리즘' 카테고리의 다른 글

[프로그래머스]타겟 넘버  (1) 2023.12.07
[백준] BOJ 11657번 타임머신  (4) 2023.12.06
[프로그래머스] 가장 큰수  (4) 2023.12.05
[백준] BOJ 1920번 수 찾기  (2) 2023.12.04
[프로그래머스]소수 찾기(C++)  (2) 2023.12.02