문제 출처: https://programmers.co.kr/learn/courses/30/lessons/42747#
문제 설명:
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회 이하입니다.
입출력 예
citations | return |
[3, 0, 6, 1, 5] | 3 |
문제 풀이 :
def solution1(citations):
answer = 0
max_range = max(citations)
min_range = min(citations)
for i in range(max_range, min_range-1, -1):
answer = 0
for cit in citations:
if cit >= i:
answer += 1
if answer >= i:
answer = i
break
return answer
def solution(citations):
citations.sort()
n = len(citations)
for i in range(n):
if citations[i] >= n-i:
return n-i
return 0
solution1은 풀면서도 더 쉽게 풀 수 있는 방법이 분명히 있다고 느껴진 방법이다. citations의 최대값과 최소값을 i의 범위로 삼고, i가 최대에서 최소로 가면서 i번 이상 인용된 논문의 수를 찾는다. 그리고 해당 논문들의 수가 i보다 많다면 i 값을 return 해준다.
하지만 매 i마다 모든 논문의 인용횟수를 다 돌면서 반복이 많이 사용되어서 좋은 알고리즘 같지는 않았다. 그래서 좀 더 고민해보고 solution과 같은 답을 찾을 수 있었다. 먼저 citations를 정렬한다. 이후 citations의 수까지 i가 범위를 돌면서 i번째 논문의 인용횟수가 n-i보다 크거나 같은지 확인한다. 만약 그렇다면 n-i 값을 반환해준다. 정리해보면 다음과 같다.
[3, 0, 6, 1, 5] -> 정렬 후 : [0, 1, 3, 5, 6]
i | 0 | 1 | 2 | 3 | 4 |
n - i (citations[i]번 이상 인용된 논문의 수) |
5 | 4 | 3 | 2 | 1 |
citations[i] (i번째 논문 인용 횟수 - 이후의 모든 값은 i번 이상 인용되었음) |
0 | 1 | 3 | 5 | 6 |
이 때 가장 먼저 i가 2일 때, citations[2] >= n - 2 가 되므로 5-2 = 3 이 답이 된다. 이 때, 인용횟수가 0번인 논문만 존재하는 경우, 0값을 리턴해줘야 하므로 반복문을 다 돌았지만 return값이 없었던 경우만 0을 리턴해준다.
'[알고리즘] 문제 풀이' 카테고리의 다른 글
프로그래머스 - 124 나라의 숫자 (0) | 2021.11.01 |
---|---|
프로그래머스 - 신규 아이디 추천 (0) | 2021.10.30 |
[해시] 프로그래머스 - 위장 (0) | 2021.10.29 |
[깊이/너비 탐색 문제] 프로그래머스 - 타겟넘버 (0) | 2021.10.26 |
[완전탐색] 프로그래머스 - 소수찾기 (0) | 2021.10.25 |
댓글