문제 출처
programmers.co.kr/learn/courses/30/lessons/42747
문제 설명
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회 이하입니다.
입출력 예
citations | return |
[3, 0, 6, 1, 5] | 3 |
입출력 예 설명
이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.
나의 코드-1(실패, 정확성: 93.8)
def solution(citations):
for x in range(max(citations), min(citations)-1, -1):
if sum(y >= x for y in citations) >= x:
return x
break
citations이라는 문자 배열의 최대값부터 최소값까지 내림차순으로 x를 지정해서 for문을 만들어줬다.
조건을 만족하면 바로 x를 반환한다.
9번 테스트케이스를 통과하지 못해서 정확성을 93.8를 기록했다.
9번 테스트케이스는 citations: [8, 9, 10, 11], return: 4와 같은 형식인데
나는 애초에 for문의 범위를 citations의 최댓값과 최소값으로 지정했기 때문에 제대로된 답을 출력시키지 못했던 것이다.
따라서 아래와 같이 citations의 최소값이 citations의 길이보다 큰 경우 citations의 길이를 출력해주는 코드를 추가해줬다.
나의 코드-2
def solution(citations):
if min(citations) > len(citations):
return len(citations)
else:
for x in range(max(citations), min(citations)-1, -1):
if sum(y >= x for y in citations) >= x:
return x
break
✨짠✨
다른 풀이-1
def solution(citations):
citations = sorted(citations)
l = len(citations)
for i in range(l):
if citations[i] >= l-i:
return l-i
return 0
최종적으로 출력되는 h값은 citations의 길이를 초과할 수 없기 때문에 for문의 범위를 citations의 길이 만큼만 지정해준다.
그리고 citations[i]가 l-i보다 크면 l-i를 반환하는 조건문을 만들어줬다. 이것을 예시1을 가지고 표로 나타내면 아래와 같다.
citations[i] | 0 | 1 | 3 | 5 | 6 |
l-i | 5 | 4 | 3 | 2 | 1 |
여기서 l-i는 citations[i]보다 큰 논문의 개수를 의미한다.
다른 풀이-2
def solution(citations):
citations.sort(reverse=True)
answer = max(map(min, enumerate(citations, start=1))) #*
return answer
별표를 친 풀이에 대해 풀이를 해보자면, enumerate(citations, start=1)를 통해 (6, 1), (5, 2), (3, 3), (1, 4), (0, 5)를 얻을 수 있다.
1번 풀이의 표 형태와 비슷하다.
map으로 각각의 경우의 최소값을 구한다. 1, 2, 3, 1, 0이 저장되어 있을 것이라고 예상할 수 있다.
이후에 이 값들의 최댓값을 구하면 문제에서 구하는 3이라는 답을 얻을 수 있다.
'(6, 1), (5, 2), (3, 3), (1, 4), (0, 5) 각각의 최소값의 최댓값이 h다'라는 논리를 이해하는 것이 어렵지만 확실히 멋있는 코드다..!
'3. 알고리즘 > 프로그래머스' 카테고리의 다른 글
[python/완전탐색] 38. 소수 찾기 (0) | 2021.01.23 |
---|---|
[python/완전탐색] 37. 카펫 (0) | 2021.01.22 |
[python/힙] 35. 더 맵게(feat. heapq 모듈) (0) | 2021.01.20 |
[python] 34. 124 나라의 숫자 ★ (0) | 2021.01.19 |
[python] 33. 오픈채팅방 (0) | 2021.01.18 |