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
}
๐ ๏ธ ์ฝ๋ ๋์ ์๋ฆฌ โ
- ์ธ์ฉ ์๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ์ฌ, ๋์ ์ธ์ฉ ์๋ถํฐ ์ฐจ๋ก๋ก ๋น๊ต
i
๋ฒ์งธ ๋ ผ๋ฌธ์ดi+1
๋ฒ ์ด์ ์ธ์ฉ๋์ง ์์๋ค๋ฉด, ๊ทธ๊ฒ ํ๊ณ- ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ณ์ ํ์, ๋๊น์ง ๋๋ฌํ๋ฉด ์ ์ฒด ๋ ผ๋ฌธ ์๊ฐ 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
}
๐ ๏ธ ๋์ ๋ฐฉ์ ์์ฝ โ
citations
์ ๋ชจ๋ ๊ฐ์ ๋ํด ๋ฒํท์ ์ฑ์ (O(n))- ํฐ ๊ฐ๋ถํฐ ๋์ ํด์
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