[정렬] 파이썬 프로그래머스 H-index

nayeoniee·2021년 8월 19일
0

Algorithm

목록 보기
11/29
post-thumbnail

문제 이해하기

문제 링크

N개의 논문 중 H번 이상 인용된 논문이 H편 이상, 나머지 논문은 H번 이하로 인용되었을 때 H는 H-index가 된다.

주의할 점은 H-index는 입력으로 주어지는 논문의 인용 횟수 리스트, citations에 속하는 수가 아니여도 된다. 문제에 주어진 예시만 보면 H-index값이 citations에 속하는 것 같지만, 아래의 예시를 보면 아니라는 것을 알 수 있다.
또한, H-index는 항상 citations의 길이보다 같거나 작은 수이다.

citations = [3, 0, 6, 1, 5] # 3
citations = [47, 42, 32, 28, 24, 22, 17, 15, 10, 10, 8] # 10
citations = [88, 89] # 2
citations = [5, 5, 5, 5] # 4
citations = [0, 0, 0] # 0
citations = [31, 66] # 2
citations = [0, 1, 2] # 1

마지막 citatoins 예시를 보면 [0, 1, 2]가 주어졌을 때,
ref를 기준이 되는 인용 횟수, cntref번 이상 인용된 논문의 개수라고 하자.
ref = 0일 때 0번이상 인용된 논문은 3편, 나머지는 없음
ref = 1일 때 1번이상 인용된 논문은 2편, 나머지는 1번 이하로 인용됨
ref = 2일 때 2번이상 인용된 논문은 1편, 나머지는 1번 이하로 인용됨
위의 예시에서 H-index는 1이다.

ref번 이상 인용되지 않는 논문은 len(citations)-cnt로 표현할 수 있다.

코드

github link

내 코드

def solution(citations):
    answer = 0  
    ref = 0  
    while(ref <= len(citations)):
        cnt = 0  
        for i in range(len(citations)):
            if (citations[i] >= ref):
                cnt += 1
        if (cnt >= ref and len(citations)-cnt <= ref):
            answer = min(cnt, ref)
        print("ref, cnt: ", ref, cnt)

        ref += 1

    return answer

ref : 기준이 되는 인용 횟수
cnt : ref번 이상 인용된 논문의 개수

while문 : H-index는 항상 citations의 길이보다 같거나 작은 수이기 때문에 ref <= len(citations)를 만족할 때 ref를 1씩 증가시키면서 탐색한다.
for문 : citations에서 ref번 이상 인용된 논문의 개수를 센다.
if문 : 인용된 논문의 개수가 ref보다 같거나 같으면서, ref번 이하로 인용된 논문의 개수가 ref이하일 때 cnt, ref중 작은 수가 answer가 된다.

citatoins = [0, 1, 2]이 주어지고 ref = 1, cnt = 2일 떄 len(citatinos)-cnt = 1이 된다.
2 와 1 중 작은 수가 H-index임을 확인할 수 있다.

다른 사람 코드

def solution(citations):
    citations.sort(reverse=True)  
    answer = max(map(min, enumerate(citations, start=1)))
    return answer

sort()로 내림차순(큰값 -> 작은값) 정렬한다.
enumerate로 (index, value)형태로 묶는다.
(여기서부터는 아직 이해 못했다 ㅠ)
그리고 최댓값(start = 1)부터 각 value에 대해 최솟값 value의 값을 min으로 추출하고, 이 추출된 값은 enumerate가 끝나는 citations 리스트의 크기에 해당하는 갯수가 나온다.
이들을 map으로 묶으면, 한 value의 입장에서 보는 최솟값 value의 집합이 나온다. 즉 h값들의 집합이나온다.
h값중 최대값을 max로 뽑아서 출력하면 된다.

profile
정말 할 수 있어!

0개의 댓글