728x90
๐๏ธ ๋ฌธ์
๐ Point
Binary Search
์ ๋จ๊ธฐ ๋์ด H๋ฅผ ์ด์ง ํ์์ผ๋ก ์กฐ์ ํ๋ฉฐ, ์๋ฆฐ ๋๋ฌด์ ํฉ์ด M ์ด์์ธ์ง ํ์ธํ๋ค.
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ๋ ๋์ ๋์ด๋ ๊ฐ๋ฅํ๋ฏ๋ก ๋์ด๋ฅผ ์ฌ๋ฆฐ๋ค. (left = mid + 1)
- ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ๋ฉด ๋ ๋ฎ์ ๋์ด๋ก ๋ด๋ ค์ผ ํ๋ค. (right = mid - 1)
๐ ์ฝ๋
def solution():
N, M = map(int, input().split())
trees = list(map(int, input().split()))
def is_enough(height):
return sum((tree - height) for tree in trees if tree > height) >= M
left, right = 0, max(trees)
result = 0
while left <= right:
mid = (left + right) // 2
if is_enough(mid):
result = mid
left = mid + 1
else:
right = mid - 1
print(result)
solution()
โ๐ป ํ์ด
์๊ฐ ๋ณต์ก๋ : O(N × log(max trees))
- function : is_enough(height)
- ํ์ฌ ๋์ด height๋ก ์ ๋จ๊ธฐ๋ฅผ ์ค์ ํ์ ๋, ์๋ ค ๋์ค๋ ๋๋ฌด ๊ธธ์ด ์ดํฉ์ ๊ณ์ฐ
- ํฉ์ด M ์ด์์ด๋ฉด True ๋ฐํ
- binary search
- ์ด์ง ํ์ ๋ฒ์ : 0 ~ ๊ฐ์ฅ ๋์ ๋๋ฌด ๋์ด
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ฅ ํฐ ๋์ด๋ฅผ ์ฐพ๋๋ค.
- ๋งค๋ฒ is_enough๋ฅผ ํธ์ถํด ์กฐ๊ฑด์ ํ์ธํ๊ณ ๋ฒ์๋ฅผ ์กฐ์ ํ๋ค.
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ๋ ๋์ ๋์ด๋ ๊ฐ๋ฅํ๋ฏ๋ก left = mid + 1
- ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด ๋ ๋ฎ์ ๋์ด๋ก right = mid - 1
728x90
'coding_test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1449. ์๋ฆฌ๊ณต ํญ์น (0) | 2025.05.05 |
---|---|
[๋ฐฑ์ค] 11660. ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 5 (ํ์ด์ฌ) (0) | 2025.04.14 |
[๋ฐฑ์ค] 17270. ์ฐ์์ธ์ ํ๋ค์ด (ํ์ด์ฌ) (0) | 2025.03.27 |
[๋ฐฑ์ค] 17609. ํ๋ฌธ (ํ์ด์ฌ) (0) | 2025.03.25 |
[๋ฐฑ์ค] 11945. ๋จ๊ฑฐ์ด ๋ถ์ด๋นต (ํ์ด์ฌ) (0) | 2025.03.08 |