Skip to content

274. H-Index (LeetCode) โ€‹

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ โ†’ LeetCode 274. H-Index


๐Ÿงฉ ๋ฌธ์ œ ์„ค๋ช… โ€‹

๊ณผํ•™์ž๊ฐ€ ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ NํŽธ์˜ ์ธ์šฉ ํšŸ์ˆ˜๊ฐ€ ๋‹ด๊ธด citations ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
H-Index๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค:

"h๋Š” ๊ณผํ•™์ž์˜ ๋…ผ๋ฌธ ์ค‘์— h๋ฒˆ ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์ด hํŽธ ์ด์ƒ์ด๊ณ , ๋‚˜๋จธ์ง€๋Š” h๋ฒˆ ์ดํ•˜ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์ผ ๋•Œ ๊ฐ€๋Šฅํ•œ ๊ฐ’ ์ค‘ ์ตœ๋Œ“๊ฐ’์ด๋‹ค."

citations ๋ฐฐ์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋†’์€ H-Index ๊ฐ’์„ ๊ตฌํ•˜์„ธ์š”.

์˜ˆ์‹œ โ€‹

ts
Input: citations = [3, 0, 6, 1, 5]
Output: 3
// 3๋ฒˆ ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์ด 3ํŽธ ์žˆ์Œ โ†’ [3, 6, 5]
// ๋‚˜๋จธ์ง€๋Š” 3๋ฒˆ ์ดํ•˜ โ†’ [0, 1]
// ์กฐ๊ฑด ๋งŒ์กฑํ•˜๋ฏ€๋กœ H-Index = 3
ts
Input: citations = [100]
Output: 1
// 1ํŽธ์˜ ๋…ผ๋ฌธ์ด 1๋ฒˆ ์ด์ƒ ์ธ์šฉ๋จ โ†’ H = 1 ๊ฐ€๋Šฅ
// ๊ทธ๋ณด๋‹ค ํฐ H๋Š” ๋…ผ๋ฌธ ์ˆ˜๊ฐ€ ๋ถ€์กฑํ•ด ๋ถˆ๊ฐ€๋Šฅ โ†’ H-Index = 1

๐Ÿ’ก ์•„์ด๋””์–ด โ€‹

์ด ๋ฌธ์ œ๋Š” ๊ฐ€๋Šฅํ•œ h ๊ฐ’๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ์ฐพ๋Š” ์ตœ์ ํ™” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์ •๋ ฌ ํ›„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ๋Œ€ h๋ฅผ ๊ตฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

โœ… ๋ฐฉ๋ฒ•: ์ •๋ ฌ + ์„ ํ˜• ํƒ์ƒ‰ โ€‹

  • citations๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
  • ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ citations[i] >= i + 1์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ๋Œ€ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์•„ i + 1์„ ๋ฐ˜ํ™˜
ts
function hIndex(citations: number[]): number {
  citations.sort((a, b) => b - a)

  for (let i = 0; i < citations.length; i++) {
    if (citations[i] < i + 1) {
      return i
    }
  }

  return citations.length
}

๐Ÿ› ๏ธ ์ฝ”๋“œ ๋™์ž‘ ์›๋ฆฌ โ€‹

  1. ์ธ์šฉ ์ˆ˜๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ, ๋†’์€ ์ธ์šฉ ์ˆ˜๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋น„๊ต
  2. i๋ฒˆ์งธ ๋…ผ๋ฌธ์ด i+1๋ฒˆ ์ด์ƒ ์ธ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๊ทธ๊ฒŒ ํ•œ๊ณ„
  3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ณ„์† ํƒ์ƒ‰, ๋๊นŒ์ง€ ๋„๋‹ฌํ•˜๋ฉด ์ „์ฒด ๋…ผ๋ฌธ ์ˆ˜๊ฐ€ H-Index

๐Ÿ“Š ์‹œ๊ฐ„ ๋ณต์žก๋„ & ๊ณต๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„ โ€‹

๋ฐฉ์‹์‹œ๊ฐ„ ๋ณต์žก๋„๊ณต๊ฐ„ ๋ณต์žก๋„
์ •๋ ฌ + ํƒ์ƒ‰O(n log n)O(1)

๐Ÿ”„ ๋‹ค๋ฅธ ํ’€์ด ๋ฐฉ๋ฒ•๊ณผ ๋น„๊ต โ€‹

  • ์นด์šดํŒ… ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” O(n) ํ’€์ด๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ •๋ ฌ ๋ฐฉ์‹์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ 
  • ํฐ ์ž…๋ ฅ์—์„œ ์‹œ๊ฐ„ ์ตœ์ ํ™”๋ฅผ ์›ํ•  ๊ฒฝ์šฐ Counting Sort ๋ฐฉ์‹์ด ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ“ ํ•ต์‹ฌ ๋‚ด์šฉ ์š”์•ฝ โ€‹

  • ํ•ต์‹ฌ ์กฐ๊ฑด: h๋ฒˆ ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์ด hํŽธ ์ด์ƒ
  • ์ตœ๋Œ€์˜ h๋ฅผ ์ฐพ์•„์•ผ ํ•จ โ†’ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ ํ›„ ์ธ๋ฑ์Šค ๋น„๊ต
  • ์ธ์šฉ ํšŸ์ˆ˜๊ฐ€ ๋†’๋”๋ผ๋„ ๋…ผ๋ฌธ ์ˆ˜๊ฐ€ ์ ์œผ๋ฉด ๋†’์€ H-Index๋Š” ๋ถˆ๊ฐ€๋Šฅ
  • ์ง๊ด€์ ์ด๊ณ  ๊ตฌํ˜„์ด ์‰ฌ์šด ์ •๋ ฌ ๋ฐฉ์‹์ด ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ž„

โšก ๋ฐฉ๋ฒ•: Counting (๋ฒ„ํ‚ท) ๋ฐฉ์‹ โ€“ O(n) โ€‹

๐Ÿ’ก ํ•ต์‹ฌ ์•„์ด๋””์–ด โ€‹

  • citations[i] ๊ฐ’์ด ํด ์ˆ˜ ์žˆ์œผ๋‚˜, ๋…ผ๋ฌธ ์ˆ˜ n์„ ๋„˜๋Š” ์ธ์šฉ์€ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ ์—†์Œ
    โ†’ ์™œ๋ƒํ•˜๋ฉด, H-Index๋Š” ์ตœ๋Œ€ n๊นŒ์ง€๋ฐ–์— ๋  ์ˆ˜ ์—†์Œ
  • ๋”ฐ๋ผ์„œ 0 ~ n๊นŒ์ง€์˜ ๋ฒ„ํ‚ท(bucket) ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด, ์ธ์šฉ ํšŸ์ˆ˜ ๋ณ„ ๋…ผ๋ฌธ ์ˆ˜๋ฅผ ์นด์šดํŒ…
  • ๋ˆ„์ ํ•ด์„œ i๋ฒˆ ์ด์ƒ ์ธ์šฉ๋œ ๋…ผ๋ฌธ์ด iํŽธ ์ด์ƒ์ธ ์‹œ์ ์„ ์ฐพ์œผ๋ฉด ๊ทธ๊ฒƒ์ด H-Index

โœ… TypeScript ์ฝ”๋“œ โ€‹

ts
function hIndex(citations: number[]): number {
  const n = citations.length
  const count = new Array(n + 1).fill(0)

  // ๋ฒ„ํ‚ท์— ์ธ์šฉ ์ˆ˜ ๋ณ„๋กœ ์นด์šดํŒ…
  for (const c of citations) {
    if (c >= n) {
      count[n] += 1 // n ์ด์ƒ์€ ์ „๋ถ€ n ๋ฒ„ํ‚ท์— ๋„ฃ์Œ
    } else {
      count[c] += 1
    }
  }

  let total = 0
  // ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ˆ„์ ํ•ฉ โ†’ h-index๋ฅผ ์ฐพ๊ธฐ
  for (let i = n; i >= 0; i--) {
    total += count[i]
    if (total >= i) {
      return i
    }
  }

  return 0
}

๐Ÿ› ๏ธ ๋™์ž‘ ๋ฐฉ์‹ ์š”์•ฝ โ€‹

  1. citations์˜ ๋ชจ๋“  ๊ฐ’์— ๋Œ€ํ•ด ๋ฒ„ํ‚ท์„ ์ฑ„์›€ (O(n))
  2. ํฐ ๊ฐ’๋ถ€ํ„ฐ ๋ˆ„์ ํ•ด์„œ total >= i์ธ ์ง€์ ์„ ์ฐพ์œผ๋ฉด H-index (O(n))

๐Ÿ“Š ์‹œ๊ฐ„ ๋ณต์žก๋„ & ๊ณต๊ฐ„ ๋ณต์žก๋„ โ€‹

ํ•ญ๋ชฉ๋ณต์žก๋„
์‹œ๊ฐ„ ๋ณต์žก๋„O(n)
๊ณต๊ฐ„ ๋ณต์žก๋„O(n) (๋ฒ„ํ‚ท ๋ฐฐ์—ด)

๐Ÿ” ์˜ˆ์‹œ ์„ค๋ช… โ€‹

ts
Input: citations = [3, 0, 6, 1, 5]
// n = 5 โ†’ ๋ฒ„ํ‚ท = [0, 0, 0, 0, 0, 0]

// count ๋ฐฐ์—ด:
// 0 โ†’ 1ํŽธ
// 1 โ†’ 1ํŽธ
// 3 โ†’ 1ํŽธ
// 5 ์ด์ƒ โ†’ 2ํŽธ (5, 6 โ†’ count[5] += 2)

// count = [1, 1, 0, 1, 0, 2]

// ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ˆ„์ ํ•ฉ total ๊ณ„์‚ฐ
i=5 โ†’ total=2  โ†’ total < i
i=4 โ†’ total=2  โ†’ total < i
i=3 โ†’ total=3  โ†’ total โ‰ฅ i โ†’ โœ… ์ •๋‹ต: 3