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

s2ul3·2022년 10월 15일
0

문제링크

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

문제설명

알고리즘

먼저 citations 리스트를 내림차순으로 정렬했다.
--> 정렬 결과 : [6, 5, 3, 1, 0]
for문으로 리스트를 돌건데 enumerate 함수를 사용하여 리스트의 index 값도 같이 사용할 것이다.
❓왜 index를 사용할까❓
--> index값으로 인용횟수가 c번 이상인 논문 개수를 구할 수 있기때문
ex) [6, 5, 3, 1, 0]
1) i = 0 --> 인용횟수가 6번 이상인 논문 개수는 i+1 = 1개
2) i = 1 --> 인용횟수가 5번 이상인 논문 개수는 i+1 = 2개
...
5) i = 4 --> 인용횟수가 0번 이상인 논문 개수는 i+1 = 5개
--> i+1을 사용하여 논문 개수를 구할 수 있다. (코드에서는 이를 num_c변수에 담아뒀다.)
우리는 인용횟수가 h번 이상인 논문 개수가 h개 이상일 때 h의 최댓값을 구해야한다.
--> Case 1 : 리스트 내 값(c)들을 순회하면서 c번 이상 인용된 논문 num_c가 c와 같을 경우 (즉 num_c == c)

  • --> c번 이상 인용된 논문 개수가 c개 이고 이때 c가 최댓값이므로 c를 return
    ex) [6, 5, 3, 1, 0]
    i = 2, c = 3일때 --> num_c = i+1 = 3
    num_c == c이므로(즉 인용횟수가 3번 이상인 논문 개수가 3개) c를 return한다.

--> Case 2 : 리스트 내 값(c)들을 순회하면서 c번 이상 인용된 논문 num_c가 c보다 큰 경우 (즉 num_c > c)

  • 먼저 예제를 살펴보자.
    ex) [5, 5, 5, 1, 0, 0, 0, 0]
    i = 3, c = 1일때 --> num_c = i+1 = 4
    즉 1(c)번 이상 인용된 논문 개수는 4개이다. 하지만 이때 c값 즉 1은 최댓값이 아니다. 그렇다면 2인가? 2도 최댓값이 아니다.
    정답은 3이다. 왜냐하면 i = 3이전 값인 i = 2번째까지의 요소 [5, 5, 5] 즉 3개가 c의 최댓값이 되기 때문이다.
    (즉 인용횟수가 3번 이상 인용된 논문 개수는 3개이다.)
    이 값은 num_c에서 1을 뺀 값이므로 num_c - 1을 return하게 된다.

--> Case 3 : 리스트 내 값(c)들을 순회하면서 모든 c값들이 num_c보다 작아 for문을 다 돌게 되는 경우

  • ex) [3, 3]
    (1) i = 0, c = 3일 때 --> num_c = 1 (3번이상 인용된 논문 개수는 1개)
    --> num_c < c 이므로 이때 c 값은 h가 될 수 없다.
    (2) i = 1, c = 3일 때 --> num_c = 2 (3번이상 인용된 논문 개수는 2개)
    --> num_c < c 이므로 c 값은 h가 될 수 없다.
    리스트 내 모든 값들이 num_c보다 작음.
    num_c는 2이므로, 2번이상 인용된 논문 개수는 2개 즉 num_c를 return하게된다.

코드

    for i, c in enumerate(citations):
        num_c = i+1  # num_c : citations[i](즉 c)번 이상 인용된 논문이 i+1개이다.
        if num_c == c: # c가 최댓값이 된다.
            return c
        elif num_c > c: 
            return num_c - 1 
    return num_c # 모든 c값들이 num_c보다 작아 for문을 다 돌게 되는 경우
profile
statistics & computer science

0개의 댓글