H-Index_복습

하이솝·2026년 7월 21일

2026.07.21

문제 풀이

1차 실행 오류


6.3/100

실패


실패 원인 분석

[7, 0, 3]의 배열이 입력으로 주어지는 경우,
정답이 2가 되어야 하지만, 1이 출력되는데, 그 이유는

for (int i = 0; i < citations.length; i++) {
	for (Integer key : map.keySet()) {
		if (key < citations[i]) {
			map.put(key, map.get(key) + 1);
		}
	}
map.put(citations[i], map.getOrDefault(citations[i], 0) + 1);
}

에서 큰 인용 횟수가 먼저 들어오면, 작은 횟수는 증가하지 않기 때문임

따라서 오름차순으로 정렬해서 해결할 수 있음

import java.util.Map;
import java.util.HashMap;

class Solution {
    public int solution(int[] citations) {
        Map<Integer, Integer> map = new HashMap<>();
        
        for (int i = 0; i < citations.length; i++) {
            for (Integer key : map.keySet()) {
                if (key < citations[i]) {
                    map.put(key, map.get(key) + 1);
                }
            }
            map.put(citations[i], map.getOrDefault(citations[i], 0) + 1);
        }
        int h = 0;
        for (Integer key : map.keySet()) {
            int n = Math.min(key, map.get(key));
            h = (h <= n ? n : h);
        }
        
        return h;
    }
}

나의 코드


소요 시간: 30분
시간 복잡도: O(n2)O(n^2)


import java.util.Map;
import java.util.HashMap;
import java.util.Arrays;

class Solution {
    public int solution(int[] citations) {
        Arrays.sort(citations);
        Map<Integer, Integer> map = new HashMap<>();
        
        for (int i = 0; i < citations.length; i++) {
            for (Integer key : map.keySet()) {
                if (key < citations[i]) {
                    map.put(key, map.get(key) + 1);
                }
            }
            map.put(citations[i], map.getOrDefault(citations[i], 0) + 1);
        }
        int h = 0;
        for (Integer key : map.keySet()) {
            int n = Math.min(key, map.get(key));
            h = (h <= n ? n : h);
        }
        
        return h;
    }
}

AI 코드


시간 복잡도: O(nlogn)O(n log n)


코드 해석

입력된 배열을 오름차순으로 정렬했기 때문에
cirtations[i]의 현재 인덱스로부터 총 길이까지는 차는
현재 상황에서 인용 가능한 최대 논문 수가 됨

따라서 현재 인용한 논문 횟수가 이보다 더 크다면 해당 값이 최댓값이 되는 구조

class Solution {
    public int solution(int[] citations) {
        Arrays.sort(citations);
        int n = citations.length;
        for (int i = 0; i < n; i++) {
            int h = n - i;               // i번째 이후 논문 수
            if (citations[i] >= h) return h;
        }
        return 0;
    }
}

문제 풀이 후기

이전 문제를 풀면서도 느꼈던 점이지만, 이번 AI 코드를 보며 더욱 더
수학적 사고방식이 정말 중요하다고 느낀다.

해당 사고방식이 있다면 같은 문제라도 코드가 훨씬 더 간결해진다.
결론적으로 문제를 많이 풀며 모범 답안을 많이 접하는 것 밖에는 정답이 없다.

0개의 댓글