ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 고득점 kit(유형정리) - H-index
    Algorithm/Sorting 2023. 1. 6. 20:51
    728x90

    코딩테스트 연습 - H-Index | 프로그래머스 스쿨 (programmers.co.kr)

     

    프로그래머스

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

    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                                           return
    [3, 0, 6, 1, 5] 3
    입출력 예 설명

    이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.

     

    솔직하게 조금 어려운 문제였다. 당장 문제 입출력을 읽을 때만 해도 간단해 보이는 문제였는데 머리가 안돌아가서 주석으로 하나하나 적어가면서 풀어내었다.

     

     

    ※ 문제 이해

    문제 이해는 간단하다. citations 배열에 있는 논문 n 편 중, h번 이상 인용된 논문이 h편 이상인 조건1, 나머지 논문이 h번 이하 인용되었다는 조건2 이렇게 두가지 조건을 만족시키면 된다.

     

     

    ※ 알고리즘

    1. citations 배열을 sort로 정렬한다.

    2. enumerate 내장함수를 이용하여 citiations 배열을 tuple 형식으로 index와 함께 나타내어 반복시킨다.

    3. 인덱스의 숫자를 j로 두고, index를 i로 둔 상태에서 최댓값을 조사해야 하므로 len(citations) - i로 뒤에서 부터 인덱스를 조사한다.

    4. 입출력 예시를 통해 하나씩 나열해 보면

     i=0 0 >= 5-0=5 (x)
     i=1 1 >= 5-1=4 (x)
     i=2 3 >= 5-2=3 (O)
     i=3 5 >= 5-3=2 (O)
     i=4 6 >= 5-4=1 (O)

    이렇게 나열할 수 있고 이를 통해 조건에 맞는 3이라는 숫자를 확인해 볼 수 있다.

    5. 조건에 맞는 만큼 count += 1 시켜주고, answer 변수에 담아서 출력시킨다.

     

    def solution(citations):
        answer = 0
        count = 0
        citations.sort()
        
        for i, j in enumerate(citations):
            #(0, 0)
            #(1, 1)
            #(2, 3)
            #(3, 5)
            #(4, 6)
            
            if j >= len(citations) - i: 
            # i=0 0 >= 5-0=5 (x)
            # i=1 1 >= 5-1=4 (x)
            # i=2 3 >= 5-2=3
            # i=3 5 >= 5-3=2
            # i=4 6 >= 5-4=1
                count += 1
                answer = count
                
        return answer

     

    len(citations) - i 하는 부분이 조금 어려웠다. 이 부분에서 입출력 예시를 통해 억지로 만들어낸 느낌이 있지만, 다 만들어 통과해 놓고 보니 최댓값을 구하는 것이기 때문에 인덱스를 큰 수에서 빼는 형식으로 비교해야 하는 것을 알 수 있었다.

     

     

    <다른 사람의 풀이>

     

    <풀이1>

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

    개인적으로 미친건가 싶은 풀이 이다. 처음에는 잘 이해가 되지 않았는데 댓글을 보고 이해를 했다.

    댓글을 첨부해 본다.

    <댓글>

    sort로 정렬해서 가장 큰값부터 작은값으로 정렬한후, enumerate로 (index, value)형태로 묶는다. 그리고 최댓값(start = 1)부터 각 value에 대해 최솟값 value의 값을 min으로 추출하고, 이 추출된 값은 enumerate가 끝나는 citations 리스트의 크기에 해당하는 갯수가 나온다. 이들을 map으로 묶으면, 한 value의 입장에서 보는 최솟값 value의 집합이 나온다. 즉 h값들의 집합이나온다. h값중 최대값을 max로 뽑아서 출력하면 된다.

     

     

    <풀이2>

    def solution(citations):
        citations = sorted(citations)
        l = len(citations)
        for i in range(l):
            if citations[i] >= l-i:
                return l-i
        return 0

    나랑 비슷하게 푼 풀이였다. l-i 이 사람도 나와 비슷한 생각을 했나보다.

    728x90

    'Algorithm > Sorting' 카테고리의 다른 글

    백준 2252 - 줄 세우기  (1) 2024.02.16
    프로그래머스 고득점 kit(유형정리) - K번째수  (0) 2023.01.06
Designed by Tistory.