코딩 테스트/Python

86. H-Index

susinlee 2025. 1. 11. 23:17

[문제]

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[풀이]

1. for문을 통해 i=1부터 citations의 개수만큼 돌면서  i 별로 i번이상 인용된 논문을 세어서 그 개수가 i 이상이라면 H-Index의 후보다.

2. 그 중 가장 큰 값이 H_Index가 된다.

3. 시간복잡도가 n^2으로 비효율적이다.

 

def solution(citations):
    n = len(citations)
    h_index = 0
    for i in range(1, n+1):
        count = 0
        for e in citations:
            if e >= i:
                count += 1
        if count >= i:
            h_index = max(h_index, i)

    return h_index

 

[풀이]

1. citations(논문별 인용 횟수)를 내림차순한다.

2. enumerate() 함수를 통해 해당 인용 횟수별로 번호를 부여하면, 인용 횟수번 이상의 논문의 수가 몇개인지 한번에 파악할 수 있다. 이때 start=1 매개변수를 주어 1부터 시작하게 만든다.

[6, 5, 3, 1, 0]

[1, 2, 3, 4, 5]                                  : enumerate(citations, start=1) 적용시

6번 이상 인용된 논문의 개수 → 1 : (6, 1)

5번 이상 인용된 논문의 개수 → 2 : (5, 2)

3번 이상 인용된 논문의 개수 → 3 : (3, 3)

1번 이상 인용된 논문의 개수 → 4 : (1, 4)

0번 이상 인용된 논문의 개수 → 5 : (0, 5)

3. h번 이상 인용된 논문이 h편 이상이어야 하므로 각 튜플에 min 함수를 적용해주자.

4. 그 중 가장 큰 값이 H_Index가 된다.

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

 

 

 

'코딩 테스트 > Python' 카테고리의 다른 글

87. n^2 배열 자르기  (0) 2025.01.12
85. 연속 부분 수열 합의 개수  (1) 2025.01.08
83. 귤고르기  (0) 2025.01.06
82. 멀리 뛰기  (1) 2025.01.05
신고 결과 받기  (0) 2025.01.02