본문 바로가기
알고리즘 문제풀이/프로그래머스

[프로그래머스] H-Index - 파이썬(python)

by mine* 2024. 1. 9.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제

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를 역순으로 정렬한다.
  • for문을 돌리면서 citations가 i+1보다 작아지면 break 한다.
  • break한 이전 시점이 정상 값이므로 i를 answer에 저장한다.

1차 시도 (실패)

  • 16개 중 1개가 실패 했다.
def solution(citations):
    answer = 0
    citations.sort(reverse=True)
    for i in range(len(citations)):
        if citations[i] <= i+1:
            answer = i
            break
    return answer

2차 시도 (성공)

  • citations[i]가 작거나 같아지는 순간을 찾아야 하므로 반대로 생각해서 citations[i]가 i+1 보다 크다면 answer에 저장하면서 값을 갱신한다.
  • 그러다가 작아지는 순간 break를 하면 이전까지 저장된 answer를 출력한다.
def solution(citations):
    answer = 0
    citations.sort(reverse=True)
    for i in range(len(citations)):
        if citations[i] >= i + 1:
            answer = i + 1
        else:
            break
    return answer

다른 풀이

  • enumerate를 사용해서 간단히 푸는 코드를 발견했다.
  • enumerate로 citations와 순서로 구성된 튜플을 만든다.
  • 그 중 작은 값을 찾아서 리스트를 만든다.
  • 만들어진 리스트에서 최댓값을 찾으면 H-index를 찾을 수 있다.
def solution(citations):
    citations.sort(reverse=True)
    answer = max(map(min, enumerate(citations, start=1)))
    return answer
왼쪽부터 구현, enumerate 사용

후기

  • 우선 문제 이해부터가 오래 걸렸다. H-index에 대한 설명을 읽어도 '음...' 이런 느낌이었어서 이전 문제들에 비해 이해하는데 생각보다 오래걸렸다.
  • 1차 시도에서 테케 1개가 틀려서 반례를 찾는것도 오래 걸렸다. 대체 뭐가 틀린건가 한참 고민함....
    • 코드 길이에 비해 만만찮은 문제...
  • enumerate에 대해 공부해봐야할 듯하다.

댓글