ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • H-index 그리고 enumerate
    Python/파이썬 자료구조 알고리듬 2019. 7. 3. 22:54
    반응형

    어떤 과학자가 발표한 논문 중, h번 이상 인용된 논문이 h 편 이상이라면
    이때 h가 이 과학자의 H-Index입니다.
    H-index를 구하는 함수를 작성하십시오.

     

    def solution(citations):
        citations.sort(reverse=True)
        for i, v in enumerate(citations):
            if i >= v:
                return i
        return i + 1
    
    
    print(solution([32, 22, 2, 0]))  # 2
    print(solution([32, 22, 3, 0]))  # 3
    print(solution([32, 22, 4, 4]))  # 4

    참고) 파이썬에서는 for 문이 끝나도 사용한 index 변수가 사라지지 않고 남아 있습니다.

    마지막의 i+1은 len(citations)의 의미입니다. 
    len(citations)을 쓰는 게 더 좋을 것 같지만, 이렇게 쓸 수도 있다는 것만 보여드리기 위해.. 

     

    저의 답도 나쁘지 않은 것 같아 올려봤습니다.
    풀고 나서 다른 분들의 풀이를 보니 같은 것은 없더라구요. 

     

    enumerate 함수가 익숙하지 않은 분들을 위해. 

     

    영어사전을 찾아보시면 이뉴머레이트에는 열거하다, 세다는 뜻이 있습니다. 
    사전엔 '52개의 (미국의) 주도를 열거하시오.'와 비슷한 예문이 있더군요.
    이런 요청(?)을 받는다면, 손가락으로 세면서 52개를 말해야겠죠?
    그럴 때 사용하는 단어인가 봅니다.

     

    enumerate 함수는 인덱스와, 요소를 동시에 하나씩 꺼내 줍니다. 

     

    열거하다 => (리스트의) 요소를 나열해 준다.
    세다 => 1,2,3,4,5..... => index를 만들어준다.
    영단어의 의미와 함수의 기능이 잘 일치하는 것 같습니다. 

     

    필요할 때 써보면 너무 편합니다. 코드의 가독성도 좋아지고요. 
    다만 함수 이름이 비교적 길고 잘 쓰지 않는 단어라 처음 쓸 때 거부감이 좀 있는 것 같습니다. 

     

    enumerate 함수를 쓰지 않고 코딩해 보았습니다.
    짧은 코드라 특별히 가독성에 문제는 없습니다만,
    enumerate 를 사용하는 편이 조금 더 깔끔한 것 같습니다. 

    def solution2(citations):
        citations.sort(reverse=True)
        for i in range(len(citations)):
            if i >= citations[i]:
                return i
        return i + 1
    
    
    print(solution2([32, 22, 2, 0]))  # 2
    print(solution2([32, 22, 3, 0]))  # 3
    print(solution2([32, 22, 4, 4]))  # 4
    
    반응형
Designed by Tistory.