이숭간 공부기록

[프로그래머스] 파이썬 _ H-Index 본문

알고리즘/프로그래머스

[프로그래머스] 파이썬 _ H-Index

이숭간 2021. 6. 5. 20:27
728x90

https://programmers.co.kr/learn/courses/30/lessons/42747

 

코딩테스트 연습 - H-Index

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표

programmers.co.kr

 

문제유형 : 정렬, 구현

 

문제풀이

  • h의 최댓값은 n이다.
  • n부터 하나씩 내려가면서 조건에 맞는 값을 찾다가 처음으로 찾는값이 h의 최댓값이므로 해당값을 반환한다.
  • 조건1(h번 인용된것이 h개 이상) 을 만족하는것을 찾으면, 그 개수가 inyong개 라고할때 자동으로 남은 것(전체-inyong개)들은 h보다 작게 되므로 굳이 남은값들의 인용된 횟수가 h보다 작은지 확인하지 않아도 됨

실수했던것

for문안에서 for루프의 대상이 되고있는 리스트의 원소를 pop하면 안된다!!!!!!!! (바보같다)

나는 남은값들도 한번더 확인해야 된다고 생각해서 h번 인용된 값들을 리스트에서 빼주고, 남은 원소들을 다시한번 확인해야 한다고 생각해서 for안에서 pop을 했더니 6,5,3,1,0 을 돌아야하는데 6,3,1 이렇게 됨 

 

정답코드

# n편중 h번 인용된 논문이 h편 이상 
# 나머지논문 (n-h)편들이 h번 이하 인용되었다면, h의 최댓값이 답

def solution(citations):
    n = len(citations)
    # i - h
    citations.sort(reverse=True)

    for i in range(n, -1, -1):
        inyong = 0
        citations_ = citations.copy()
        # n회 이상 인용된것들을 찾기

        for a, b in enumerate(citations_):
            if (b >= i):
                inyong += 1
        if (inyong < i):
            continue  # 5->4

        if (len(citations_)-inyong <= i):
            return i