๐ญ ๋ฌธ์ ์ดํด
์๋ฅผ ์ ์๋ ์ต์ ๋์ด์ธ 1 ๋ถํฐ max(๋๋ฌด์ ๋์ด ๋ฐฐ์ด) ์ฌ์ด์์ ์ต์ m๋ฏธํฐ ๊ธธ์ด์ ๋๋ฌด๋ฅผ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด
์ด๋ถํ์์ ์งํํ๋ฉฐ m์ ์ฐพ์๋๊ฐ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅธ ๋๋ฌด ๊ธธ์ด์ ํฉ์ ๊ตฌํ๊ธฐ ์ํด ์ต์ ์ ๊ฒฝ์ฐ 100๋ง ๋ฒ์ sum ์ฐ์ฐ์ด log(109) ๋งํผ ๋ฐ๋ณต๋๋ค.
์ด ํ์ด๋ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์ง๋ ์์ง๋ง
Counter๋ฅผ ์ฌ์ฉํด์ 100๋ง ๋ฒ์ ์ฐ์ฐ์ ๊ฐ์์์ผ ์๊ฐ์ ์ค์ด๋ ํ์ด๋ฅผ ์ฐพ๊ฒ ๋์๋ค.
๊ตฌํ ์ธ์ด: Python
1. ๋ด ํ์ด
import sys
r = sys.stdin.readline
def binary_search(m, trees):
answer = 0
left = 1
right = max(trees)
while left <= right:
mid = (left + right) // 2
total_cut = sum(map(lambda x: x - mid if x >= mid else 0, trees))
if total_cut >= m:
answer = mid
left = mid + 1
else:
right = mid - 1
return answer
n, m = map(int, r().split())
trees = list(map(int, r().split()))
print(binary_search(m, trees))
2. Counter๋ฅผ ํ์ฉ
from collections import Counter
import sys
r = sys.stdin.readline
def binary_search(m, trees):
answer = 0
left = 1
right = max(trees)
while left <= right:
mid = (left + right) // 2
total_cut = sum((tree - mid)*cnt for tree, cnt in trees.items() if tree > mid)
if total_cut >= m:
answer = mid
left = mid + 1
else:
right = mid - 1
return answer
n, m = map(int, r().split())
trees = Counter(map(int, r().split()))
print(binary_search(m, trees))
์ด ๊ฒฐ๊ณผ ์ฝ 7๋ฐฐ์ ๋ ์๋๊ฐ ๋นจ๋ผ์ง ๊ฒ์ ํ์ธํ ์ ์์๋ค.
'Problem_Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ๋ฐฑ์ค 1654 ๋์ ์๋ฅด๊ธฐ / ์ด๋ถํ์ (0) | 2021.02.09 |
---|---|
[BOJ] ๋ฐฑ์ค 10815 ์ซ์ ์นด๋ / ์ด๋ถํ์ (0) | 2021.02.09 |
[BOJ] ๋ฐฑ์ค 1920 ์ ์ฐพ๊ธฐ / ์ด๋ถํ์ (0) | 2021.02.09 |
[BOJ] ๋ฐฑ์ค 9205 ๋งฅ์ฃผ ๋ง์๋ฉด์ ๊ฑธ์ด๊ฐ๊ธฐ / BFS (0) | 2021.02.08 |
[BOJ] ๋ฐฑ์ค 2573 ๋น์ฐ / BFS (0) | 2021.01.14 |