๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ฝ”๋”ฉํ…Œ์ŠคํŠธ/TIL

[LC150] H-Index (Binary Search & Greedy)

by moon101 2025. 7. 20.

H-Index ๋ฌธ์ œ 

 

 

์ด ๋ฌธ์ œ ์—ญ์‹œ ์˜ˆ์ „์— ํ’€๋ ค๊ณ  ํ•˜๋‹ค๊ฐ€ ๋ชป ํ’€์—ˆ๋˜ ๋ฌธ์ œ์ธ๋ฐ ์ด์ „๊ณผ ๋˜‘๊ฐ™์ด ๊ทธ๋ฆฌ๋””ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€๋ ค๊ณ  ํ–ˆ๋‹ค. ๋จผ์ € citations ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ ๋‹ค์Œ์— citations[i], ํ˜„์žฌ citation๋œ ๊ฐฏ์ˆ˜๊ฐ€ n-i ํ•œ ๊ฐฏ์ˆ˜๋ณด๋‹ค ์ž‘์„ ๋•Œ max ๊ฐ’์„ ์—†๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์—ˆ๋‹ค. 

 

 

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ, citations = [3, 0, 6, 1, 5] ์ผ ๊ฒฝ์šฐ์—๋Š” ์ž˜ ๋™์ž‘ํ•œ๋‹ค. 

 

i๊ฐ€ 3์ผ๋•Œ๋Š” if ์กฐ๊ฑด๋ฌธ์ด false๊ฐ€ ๋˜์„œ ๋” ์ด์ƒ h ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š๊ณ  for ๋ฌธ์ด ์ข…๋ฃŒ๊ฐ€ ๋˜๊ณ  h ๊ฐ’์€ 3์ด ๋œ๋‹ค. ์ด๋•Œ๋Š” ์ •๋‹ต์ธ๋ฐ, input ๊ฐ’์ด citations = [100] ์ผ ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. 

 

i๊ฐ€ ์ผ๋•Œ n - i >= citations[i] ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— h๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€์•Š๊ณ  default ๊ฐ’์ด 0์ด ๋˜๊ณ  ์ด๊ฑด ์˜ค๋‹ต์ด๋‹ค. h ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋์–ด๋„ ์˜ค๋‹ต์ธ๋ฐ, n์ด 1๊ฐœ์ด๊ณ  ์ฒซ๋ฒˆ์งธ ๋…ผ๋ฌธ์ด ์ธ์šฉ๋œ ์ˆ˜๊ฐ€ 100์ด๋ฉด H ์ธ๋ฑ์Šค๋Š” ์ตœ๋Œ€ 1์ด ๋˜๋Š” ๊ฒŒ ๋งž๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๋กœ์ง์„ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ์—ด์‹ฌํžˆ ๋…ธ๋ ฅํ•ด๋ดค์œผ๋‚˜... ์ ์  ๋‚ด ์ฝ”๋“œ๋Š” ๋ฏธ๊ถ์†์œผ๋กœ.....

 

๊ฒฐ๊ตญ gpt๋ž‘ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ solutions์„ ์ฐธ๊ณ ํ•ด์„œ ๋‹ต์„ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ๋ณดํ†ต i๋ฅผ ๋’ค์—์„œ๋ถ€ํ„ฐ ์ฐพ๋Š”๋ฐ ๋‚˜๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 0 -> n ์ˆœ์„œ์— ๋งž๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ดค๋‹ค. ์ˆ˜์ •๋œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

 

๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฉด ์ธ๋ฑ์Šค i ๋ณด๋‹ค ์ž‘์€ ์ธ๋ฑ์Šค์˜ ๊ฐ’์€ i ๋ณด๋‹ค ์ž‘๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ๋ฑ์Šค i ๋ณด๋‹ค ํฐ ์ธ๋ฑ์Šค์˜ ๊ฐ’์€ i ๋ณด๋‹ค ํฌ๋‹ค. h๋Š” ์ตœ๋Œ€ n๊ฐœ (๋…ผ๋ฌธ์˜ ๊ฐฏ์ˆ˜) ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ ๊ฐ’์„ n์œผ๋กœ ์„ธํŒ…ํ•œ๋‹ค์Œ ํ•˜๋‚˜์”ฉ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ๋‹ต์„ ์ฐพ๋Š”๋‹ค. h๊ฐ€ citations[i] ๋ณด๋‹ค ํด ๊ฒฝ์šฐ, citations[i]๋Š” h-index๋ฅผ ๋ฌด์กฐ๊ฑด ๋งŒ์กฑํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, citations[i] ๋ณด๋‹ค ํฐ ๊ฐ’๋“ค ์ค‘์— ์ •๋‹ต์ด ์žˆ๋Š”์ง€ ๊ณ„์† ์ฐพ๊ณ  h <= citations[i] ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ๋”์ด์ƒ h-index๋ฅผ ๋งŒ์กฑํ•˜๋Š” ํฐ ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ๋ฆฌํ„ดํ•œ๋‹ค. ์ œ๋Œ€๋กœ ์„ค๋ช…์ด ๋ฌ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ, ๋‚˜๋Š” ์ด ๋กœ์ง์„ ์ดํ•ดํ•˜๋Š”๊ฒŒ ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋‹ค. 

 

 

 

 

ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ๋˜ ์žˆ์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค! ๊ทธ๋ฆฌ๋”” ๋ณด๋‹ค ์ฝ”๋“œ๋Š” ๋” ๊ธธ์ง€๋งŒ ํ›จ์”ฌ ์ง๊ด€์ ์ธ ๋ฐ”๋กœ binary search๋ฅผ ์‚ฌ์šฉํ•œ ํ’€์ด์ธ๋ฐ binary search๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ๊ณ  ๋‹ต์ด ์–ด๋А ๋ฒ”์œ„ ์•ˆ(within a certain range)์— ์žˆ์œผ๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

๋ฌธ์ œ์˜ constraint๋ฅผ ๋ณด๋ฉด citations[i] ๋Š” 0๋ถ€ํ„ฐ 1000๊นŒ์ง€์ธ๋ฐ h-index์˜ ์ตœ๋Œ€ ๋ฒ”์œ„๋Š” ์ตœ๋Œ€ ์ธ์šฉ ์ˆ˜ 1000์„ ๋„˜์„ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ h-index๋Š” 0๋ถ€ํ„ฐ 1000์‚ฌ์ด์˜ ๊ฐ’์ด ๋˜๊ณ , ํ’€์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

 

class Solution {
    public int hIndex(int[] citations) {
        int n = citations.length;
        int hIndex = 0;

        Arrays.sort(citations); // ์ •๋ ฌ (O(n log n))

        int left = 0, right = 1001; // hIndex์˜ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„ [0, 1001]

        while (left <= right) {
            int mid = left + (right - left) / 2; // overflow ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์ค‘๊ฐ„๊ฐ’ ๊ณ„์‚ฐ

            // citations ๋ฐฐ์—ด์—์„œ mid ์ด์ƒ์ธ ์ฒซ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์Œ (lower_bound ์—ญํ• )
            int lbIdx = lowerBound(citations, mid);
            int citedAtLeastMid = n - lbIdx; // mid ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ ์ˆ˜

            if (mid <= n && citedAtLeastMid >= mid) {
                hIndex = mid;     // ํ˜„์žฌ mid๋Š” ๊ฐ€๋Šฅํ•œ h-index
                left = mid + 1;   // ๋” ํฐ h-index๊ฐ€ ์žˆ๋Š”์ง€ ์˜ค๋ฅธ์ชฝ ํƒ์ƒ‰
            } else {
                right = mid - 1;  // ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์™ผ์ชฝ ํƒ์ƒ‰
            }
        }

        return hIndex;
    }

    private int lowerBound(int[] nums, int target) {
        int left = 0, right = nums.length;

        while (left < right) {
            int mid = left + (right - left) / 2;

            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }

        return left; // target ์ด์ƒ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค
    }
}

 

 

c++ ์— ์žˆ๋Š” lowerbound/upperbound ํ•จ์ˆ˜๋ฅผ ์ž๋ฐ”์—์„œ๋„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฑธ๋กœ ์•Œ๊ณ ์žˆ๋Š”๋ฐ ์ € ์œ„์— lowerBound ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•œ ๊ฒƒ๋ณด๋‹ค๋Š” 

 

์ด ์ฝ”๋“œ๊ฐ€ ๋” ์ง๊ด€์ ์ธ ๊ฒƒ ๊ฐ™๋‹ค. 

๋Œ“๊ธ€