๐Ÿ‹ โšพ๏ธ ๐Ÿ’ป ๐ŸŽฌ ๐ŸŽฎ

coding_test

[๋ฐฑ์ค€] 2805. ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ (ํŒŒ์ด์ฌ)

aeightchill 2025. 4. 14. 21:57
728x90

๐Ÿ—‚๏ธ   ๋ฌธ์ œ 

2805. ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ



๐Ÿ“Œ   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))

 

  1. function : is_enough(height)
    • ํ˜„์žฌ ๋†’์ด height๋กœ ์ ˆ๋‹จ๊ธฐ๋ฅผ ์„ค์ •ํ–ˆ์„ ๋•Œ, ์ž˜๋ ค ๋‚˜์˜ค๋Š” ๋‚˜๋ฌด ๊ธธ์ด ์ดํ•ฉ์„ ๊ณ„์‚ฐ
    • ํ•ฉ์ด M ์ด์ƒ์ด๋ฉด True ๋ฐ˜ํ™˜
  2. binary search
    • ์ด์ง„ ํƒ์ƒ‰ ๋ฒ”์œ„ : 0 ~ ๊ฐ€์žฅ ๋†’์€ ๋‚˜๋ฌด ๋†’์ด
    • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ€์žฅ ํฐ ๋†’์ด๋ฅผ ์ฐพ๋Š”๋‹ค.
      • ๋งค๋ฒˆ is_enough๋ฅผ ํ˜ธ์ถœํ•ด ์กฐ๊ฑด์„ ํ™•์ธํ•˜๊ณ  ๋ฒ”์œ„๋ฅผ ์กฐ์ ˆํ•œ๋‹ค.
      • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ๋” ๋†’์€ ๋†’์ด๋„ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ left = mid + 1
      • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋” ๋‚ฎ์€ ๋†’์ด๋กœ right = mid - 1

 

 

 

 

 

 

 

728x90