자료구조, 코딩테스트

[코딩테스트] Programmers - H Index (실패)

RꞮbble 2026. 6. 8. 21:12

 

코딩테스트 연습 - H-Index | 프로그래머스 스쿨

 

프로그래머스

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

programmers.co.kr

 

 

풀이

[문제]
H-Index는 과학자의 생산성과 영향력을 나타내는 지표
어느 과학자의 H_Index를 나타내는 값인 h를 구해야 한다. 

H_index 구하는 방법
논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 
나머지 논문이 h번 이하 인용되었다. 
이때 h의 최댓값이 H_index이다. 

[입력]
- 논문의 인용 횟수 배열 citations 

[출력]
- 과학자의 H_index 반환 

[제한사항]
- 1편 <= 발표한 논문의 수 <= 1,000편
- 0회 <= 논문별 인용 횟수 <= 10,000회 

[입출력 예]
citations = [3, 0, 6, 1, 5]]

논문의 수 = 5
3번 이상 인용된 논문이 3편 (h번 이상 인용된 논문이 h편 이상)
나머지 논문은 3번 이하 인용되었다. (나머지 논문은 h번 이하 인용)
H-Index = 3 


[풀이]
1
i번째 논문이 citations[i]번 이상 인용된 논문이 citations[i]편이고
나머지 논문은 citations[i]번 이하 인용되었는지 확인. 
이 과정을 citations 길이만큼 반복
조건을 만족하면 H-index를 반환 

 

 

코드1 - 오답

using System;

public class Solution {
    public int solution(int[] citations) 
    {
        int count1 = 0; 
        int count2 = 0; 
        int max = -1;
        
        for(int i = 0; i < citations.Length; i++)
        {
            for(int j = 0; j < citations.Length; j++)
            {
                if(citations[j] >= citations[i])
                    count1++;
                
                else
                    count2++;
            }
            
            if(count1 >= citations[i] && count2 <= citations[i])
                max = citations[i] > max ? citations[i] : max;
                
            count1 = 0; 
            count2 = 0; 
            
        }
        
        return max;
    }
}

 

 

뭐 때문에 틀렸는지 전혀 감이 오지 않아서 llm을 사용해서 내 코드에 대한 피드백을 받아봤다. 

 

이 문제에서 h는 citations[i]이어야 한다는 말은 없다. 

나는 h가 citations[i]라고 보고 문제를 풀었다. h의 후보군을 citations 원소값으로 줄이니 오답이 나왔던 것이다. 

h는 범위가 딱히 정해져 있지 않으므로, h는 0부터 검사하면 된다. 

 

 

코드 2 - 정답

using System;

public class Solution {
    public int solution(int[] citations) 
    {
        int count1 = 0; 
        int count2 = 0; 
        int max = 0; 

        for(int h = 0; h <= citations.Length; h++)
        {
            for(int j = 0; j < citations.Length; j++)
            {
                if(citations[j] >= h)
                    count1++;
                
                if(citations[j] <= h)
                    count2++;
            }

            if(count1 >= h && count2 <= h) 
            {
                max = h > max ? h : max;
            }

            count1 = 0; 
            count2 = 0; 
        }

        return max;
    }
}