[프로그래머스] Lv.2 H-Index (Python)

seulzzang·2022년 9월 13일
0

코딩테스트 연습

목록 보기
8/44

📍문제

[프로그래머스] Lv.2 H-Index

📍풀이

  • 문제 이해만 엄청 오래걸림..
    👉[연구논문을 위한 핵심 10단계] H-지수(H-Index) 란 무엇인가?

    이 문서를 참조하면 좀 쉽다!
  • 요약하자면 가장 많이 인용된 논문순으로 정렬한 후 피 인용수가 논문수와 같아지거나 작아지기 시작하는 숫자가 H-Index라는 것이다.
  • 그렇다면 이를 문제에 그대로 적용시켜서, citations를 내림차순으로 정렬한 뒤 피 인용수가 논문의 수랑 같아지는 지점을 answer에 담아주면 끝!
  • 이 그림을 보면 코드를 더 짜기 수월하다.

    이 표를 그대로 코드로 구현해주면 통과 쌉가능(이거보고 코드짰음..😂)

💻코드

def solution(citations):
    answer = 0
    citations.sort(reverse = True) # 내림차순으로 정렬
    for num, citation in enumerate(citations):
        # 피 인용수가 논문의 수랑 같아지는 지점(num은 0부터 시작하니까 +1)
        if citation >= num+1: 
            h_index = num+1
            answer = h_index

    return answer

enumerate를 사용하여 인덱스 번호 num과 피 인용수 citation을 받아주고, 피 인용수 citation이 논문의 수 num+1(주석에도 적혀있다시피 num은 0부터 시작하니까 +1을 해줘야 함)이랑 같아지는 지점이 h_index가 된다.
사실 answer = num+1이라고 바로 해도 무관한데, h_index라는 변수를 줘서 좀 코드를 수월하게 이해하고 싶었다.
문제 이해하는데는 오래걸렸지만 막상 짜보니까 별거 아닌 코드..

📍다른사람 풀이

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

난 이 코드가 더 이해하기 힘든데..
제일 안쪽부터 분석해 나가보자.

citations = [3, 0, 3, 6, 1, 5]
citations = sorted(citations, reverse=True) # 내림차순 정렬
print(list(enumerate(citations, start = 1)))
<출력>
[(1, 6), (2, 5), (3, 3), (4, 3), (5, 1), (6, 0)]

enumerate를 통해 1부터 시작하는 key, value형으로 변환한다.
(a, b) : (인덱스 1부터 커지는 중, 그 인덱스의 논문 인용 횟수)

print(list(map(min, enumerate(citations, start = 1))))
<출력>
[1, 2, 3, 3, 1, 0]

그렇게 교차하는 지점을 확인하기 위해서 min함수로 큰 값들을 없애준다. (피 인용수와 논문의 수가 같아지는 지점을 이렇게 찾은듯 하다.)

print(max(map(min, enumerate(citations, start = 1))))
<출력>
3

그 중에서 가장 큰 값이 정답이 된다. 위에 나왔던 표 처럼 피 인용수와 논문의 수가 같아지는 지점에서 그 최댓값을 찾아주는 것이다.

이런식인듯 하다.. 미천한 내 머리로 감히 해석을 하려 들어서 지금 머리가 터질 것 같음.
도대체 이런 문제를 보고 저렇게 코드를 어떻게 짜는지 정말 궁금하다🤔
문제 이해능력이 어마무시하구나..

profile
중요한 것은 꺾이지 않는 마음

0개의 댓글