Algorithm
[프로그래머스] H-Index
쑤야.
2023. 12. 18. 13:04
https://school.programmers.co.kr/learn/courses/30/lessons/42747
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근
- citations 데이터로 점검할 경우, citations에 속하지 않는 인용 횟수에 대해 점검할 수 없다.
- 주어진 범위 내에서 조건을 만족하는 최대 값을 찾는 것이 목표이므로, 이진 탐색을 사용할 수 있다.
로직
- 논문 인용 횟수의 최솟값인 0과 최댓값인 10000을 경계로 하여 이진 탐색을 수행한다.
- 조건을 만족하는 경우 max를 사용해서 갱신한다.
- 조건을 만족하는 경우 left 값을 mid + 1로 갱신, 만족하지 않는 경우는 right 값을 mid - 1로 갱신하여 이진탐색을 마저 수행한다.
코드
def solution(citations):
left = 0
right = 10000
result = 0
while left <= right:
mid = (left+right)//2
up = 0
down = 0
for i in citations:
if i >= mid:
up += 1
else:
down += 1
if up >= mid and down <= mid:
result = max(result, mid)
left = mid + 1
else:
right = mid-1
return result
참고
- 기존 데이터의 순서를 지킬 필요가 없는 문제이므로 정렬을 사용할 수 있다.
citations[i] >= l-i
- citations[i]는 논문의 인용 수
- l-i는 h번 이상 인용된 논문의 개수
- h번 이상 인용된 논문이 h편 이상인지를 점검하는 조건문이다.
- i-1까지의 데이터들은 정렬으로 인해 h번 이하 인용이 보장되어 있다.
def reference(citations):
citations = sorted(citations)
l = len(citations)
for i in range(l):
if citations[i] >= l-i:
return l-i
return 0