2025. 3. 12. 15:39ㆍ프로그래머스/LV.2
문제링크: H-Index
문제설명
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회 이하입니다.
문제풀이
일단 가장 많이 인용된 수부터 비교하여 가장 먼저 그 수만큼 인용된 논문이 그 수 이상이 되는 값이 정답이라고 생각했다.
def solution(citations):
answer = 0
citations.sort()
l=len(citations)
num=sorted(list(set(citations)),reverse=True)
for n in num:
cnt=l-citations.index(n)
if cnt>=n:
return n
2개만 맞음... 12.5점...
나머지가 h번 이하로 인용되었다는게 미만이어도 되는 건 줄 알았는데 무조건 h번 이하를 포함해야한다. 그니까 다른 값에 h인 값이 있어야 하는 것.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
예를들어, [1, 10, 11]과 같은 경우 h값은 1이 아니라 2 입니다.2번 이상 인용된 논문이 (10회, 11회) 총 2편이 있기 때문에 2가 최댓값이 됩니다.
[1,10,11] return 2[10,11] return 2[0,0,0,0,0] return 0
왜 인덱스로 구해야 하는지 이해가 안돼서 프로그래머스의 질문하기 글들을 쭉 읽었다.
이 글을 보니 어느정도 납득이 된다.
h이상 인용이 된 논문이 h개 이상일때..여기서 인용된 수는 꼭 h번을 포함하지 않아도 된다. 이상이기만 하면 됨.
그렇기 때문에 인용수를 기준으로 잡는 건 많은 경우를 놓칠 수 있음.
나의코드
def solution(citations):
answer = 0
citations.sort(reverse=True)
for idx,n in enumerate(citations):
if idx+1>n:
return idx
return len(citations) # 모든 논문이 통과하는 경우
참고하기
def solution(citations):
citations.sort(reverse=True)
answer = max(map(min, enumerate(citations, start=1)))
return answer
1️⃣ enumerate(citations, start=1)
citations = [6, 5, 3, 1, 0]
📌 enumerate(citations, start=1)을 하면, 각 논문의 순서(논문 개수)와 인용 횟수를 함께 가져옴.
idx (논문 개수) n (인용 횟수)1 | 6 |
2 | 5 |
3 | 3 |
4 | 1 |
5 | 0 |
2️⃣ map(min, enumerate(citations, start=1))
각 논문에 대해 "논문 개수(idx)" vs "인용 횟수(n)" 중 더 작은 값을 선택함.
즉, min(idx, n)을 계산하면:
idx (논문 개수) n (인용 횟수) min(idx, n)1 | 6 | 1 |
2 | 5 | 2 |
3 | 3 | 3 |
4 | 1 | 1 |
5 | 0 | 0 |
3️⃣ max(...)
이제 max([1, 2, 3, 1, 0])을 구하면 H-Index = 3! 🎯
🔥 핵심 아이디어 정리
- idx는 논문 개수를 의미
- n은 각 논문의 인용 횟수
- H-Index는 idx ≤ n을 만족하는 최대 idx를 찾는 것!
- 따라서 min(idx, n)을 구하고, 그중에서 최댓값(max(...))을 선택하면 H-Index를 구할 수 있음!
✅ 예제 테스트
예제 1️⃣
citations = [6, 5, 3, 1, 0]
- enumerate(citations, start=1)
[(1, 6), (2, 5), (3, 3), (4, 1), (5, 0)]
- map(min, ...)
[1, 2, 3, 1, 0]
- max([1, 2, 3, 1, 0]) = 3
✅ 정답: 3
예제 2️⃣
citations = [10, 8, 5, 4, 3]
- enumerate(citations, start=1)
[(1, 10), (2, 8), (3, 5), (4, 4), (5, 3)]
- map(min, ...)
[1, 2, 3, 4, 3]
- max([1, 2, 3, 4, 3]) = 4
✅ 정답: 4
🚀 정리
📌 이 코드는 H-Index를 간결하게 계산하는 수학적 접근법!
- 논문의 개수(idx+1) vs 인용 횟수(n) 중 더 작은 값(min(idx, n))을 선택
- 그중 최댓값(max(...))을 반환하면 H-Index!
'프로그래머스 > LV.2' 카테고리의 다른 글
[프로그래머스][LV.2] 카펫 | python3 (0) | 2025.03.14 |
---|---|
[프로그래머스][LV.2] 더 맵게 | python3 (0) | 2025.03.12 |
[프로그래머스][LV.2] 가장 큰 수 | python3 (0) | 2025.03.11 |
[프로그래머스][LV.2] 프로세스 | python3 (0) | 2025.03.10 |
[프로그래머스][Lv.2] 의상 | python3 (0) | 2025.03.05 |