
์ด ๋ฌธ์ ์ญ์ ์์ ์ ํ๋ ค๊ณ ํ๋ค๊ฐ ๋ชป ํ์๋ ๋ฌธ์ ์ธ๋ฐ ์ด์ ๊ณผ ๋๊ฐ์ด ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ ค๊ณ ํ๋ค. ๋จผ์ 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 ๋ฉ์๋๋ฅผ ์ง์ ๊ตฌํํ ๊ฒ๋ณด๋ค๋

์ด ์ฝ๋๊ฐ ๋ ์ง๊ด์ ์ธ ๊ฒ ๊ฐ๋ค.
'์ฝ๋ฉํ ์คํธ > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [LC150] DP๋ฅผ ํ์ฉํ Jump Game 1 & 2 (1) | 2025.07.06 |
|---|---|
| [LC150] ํ ๋๋ง๋ค ํ๋ฆฌ๋ Remove Element ๋ฌธ์ (0) | 2025.06.26 |
| [LC150] Array/String - 1 (0) | 2025.03.16 |
| [LC150] ๋ฆฌํธ์ฝ๋ Top Interview 150 ์์ (0) | 2025.03.11 |
| [99ํด๋ฝ] 5์ฃผ ์ฝํ ์คํฐ๋ ํ๊ธฐ (0) | 2025.02.27 |
๋๊ธ