ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스/JAVA] H-Index
    Algorithm/Java 2025. 1. 24. 20:39


     

     

    📌 문제 요약 


    [ 오답 노트 ]

    ❌ 기존 오답 코드

    import java.util.*;
    
    class Solution {
        public int solution(int[] citations) {
            int answer = 0;
    
            // 1. 오름차순 정렬
            Arrays.sort(citations);
    
            // 2. 반복 횟수 세는 반복문
            for (int j = 0; j < citations.length; j++) {
                int up = 0, down = 0;
    
                if (citations[j] > j) {
                    up++;
                } else if (citations[j] < j) {
                    down++;
                }
    
                if (up == down) {
                    answer++;
                    break;
                }
            }
    
            return answer;
        }
    }



    📌 기존 코드의 문제점

     

    - 문제 조건 잘못 이해

    • "h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다." 이 문제의 조건을 "논문이 h편 이상인 논문의 개수 == 논문이 h번 이하 인용된 논문의 개수"로 잘못이해했다. 
    • 기존 문제 조건은 h의 최댓값을 찾는 것이고, 따라서 "h번 이상 인용된 논문이 h편 이상"인 조건만 충족시킨다면 나머지 조건은 자동적으로 충족하게 된다. 

     



    [ 정답 코드 & 올바른 풀이 ]

    📌 올바른 풀이

    1회 인용(1회이상): 1,3,5,6 => 4개
            (1회이하): 0,1 => 2개
    -> 4편의 논문이 1회 이상 인용이므로 조건 충족x
    2회 인용(2회이상): 3,5,6 => 3개
            (2회이하): 0,1 => 2개
    -> 3편의 논문이 2회 이상 인용이므로 조건 충족x
    3회 인용(3회이상): 3,5,6 => 3개
            (3회이하): 0,1,3 => 3개
    -> 3편의 논문이 3회 이상 인용이므로 조건 충족o

     

    1. "h번 이상 인용된 논문이 h편 이상"인 조건만 충족시키기

    • h번 이상 인용된 논문의 수 ≥ h 조건을 정확히 반영한다.
    • 이때 h는 정렬된 배열에서 citations.length - i로 계산한다. 

     

    2. 조건 만족 시 종료

    • if (citations[i] >= h) 조건을 만족하는 경우 H-Index를 찾았으므로 반복문 종료

     



    📌 정답 코드

    import java.util.*;
    
    class Solution {
        public int solution(int[] citations) {
            int answer = 0;
    
            // 배열 오름차순 정렬
            Arrays.sort(citations);
            // [0, 1, 3, 5, 6]
    
    // citations[i]에서 i값을 증가시키고 논문의 수를 감소시키면서 비교 했을 때
    // 인용 횟수가 논문의 수 이상이 되었을 때의 논문의 수가 H-Index가 된다
            //     1회 인용(1회이상): 1,3,5,6 => 4개
            //            (1회이하): 0,1 => 2개
            // -> 4편의 논문이 1회 이상 인용이므로 조건 충족x
            //     2회 인용(2회이상): 3,5,6 => 3개
            //            (2회이하): 0,1 => 2개
            // -> 3편의 논문이 2회 이상 인용이므로 조건 충족x
            //     3회 인용(3회이상): 3,5,6 => 3개
            //            (3회이하): 0,1,3 => 3개
            // -> 3편의 논문이 3회 이상 인용이므로 조건 충족o
            for(int i = 0; i < citations.length; i++) {
                // 인용된 논문 수
                // 5개 -> 4개 -> 3개 -> 2개 -> 1개 순으로
                int h = citations.length - i;
    
    			// citations[i] 는 0 -> 1 -> 3 -> 5 -> 6 순으로
                if(citations[i] >= h) {
                    answer = h;
                    break;
                }
            }
            return answer;
        }
    }
Designed by Tistory.