n, m = map(int,input().split())
treeHeight = list(map(int, input().split()))
# ์ ์ด๋ M๋ฏธํฐ์ ๋๋ฌด๋ฅผ ์ง์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด์ ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
treeHeight.sort()
resultList=list()
def binarySearch(data, m2):
low = 1
# m์ 1<= m <= 2,000,000,000
high = data[len(data)-1]
# n๋ 1์ด์์ด๊ธฐ์ ์
๋ ฅ๋ ๋ฐ์ดํฐ์ค ๊ฐ์ฅ ํฐ๊ฐ์ ๊ฒฝ์ฐ ๊ทธ ๊ฐ๋ณด๋ค 1 ๋ ์์๊ฐ๋ถํฐ ๊ทธ ๋ฐ์ ๊ฐ๊น์ง ํ์ํ๋ฉด ๋๋ฏ๋ก ๊ฐ์ฅ ํฐ๊ฐ์ ๋๊ฐ์ผ๋ก ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
result = 0
while low <= high:
mid = (low + high) // 2
# ์ฌ๊ธฐ์์ mid ๊ฐ์ด ์ ๋จ๊ธฐ์ ์ค์ ํ ๋์ด H
totalM = 0
for tree in data:
if tree > mid:
totalM += (tree - mid)
# tree๊ธธ์ด๊ฐ mid ๋ณด๋ค ํด๋๋ง ๋นผ์ฃผ๋๋ก ์กฐ๊ฑด๋ฌธ ์ค์ => totalM์ ์์๊ฐ์ ๋ํ์ง ์๋๋ก
if totalM >= m2:
# mid(H) ๊ฐ์ ๋์ฌ์ ํ์ํด์ผํจ
if result < mid :
result = mid
low = mid + 1
else:
high = mid - 1
return result
#print(max(resultList))
#์ด๋ ๊ฒ max () ๋ฅผ ์ฌ์ฉํ์๋ ์ฝ์คํ ์ด๊ณผ๊ฐ ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ ์๋ ์์ ๋ฐ๋ผ์ ๊ฐ์ ๊ณ์ ๋ณ๊ฒฝํด์ค๊ฒ.
# mix ๋ max์ ์ธ์์ ์ ํ์ด ์๋๊ฒ ๊ฐ์ง๋ง ์ค์ ์ธ์๊ฐ ๋ฌด์ํ ๋ง์์ง๊ฒ ๋๋ค๋ฉด ์ฝ์คํ ์ด๊ณผ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค.
print(binarySearch(treeHeight, m))
๋ฌธ์ ํ์ด
1. ์ด๊ธฐ ์ ๋ ฅ ์ฒ๋ฆฌ => treeHeight์ ๋๋ฌด ๊ธธ์ด ์ ์ฅ
2. ์ด์งํ์ ๋ฉ์๋ ๊ตฌํ => ๋๋ฌด์ ๊ธธ์ด๋ ์ต์ 1์ด๊ธฐ ๋๋ฌธ์ 1 ~ ์ต๋๊ฐ๊น์ง ํ์
3. ๋๋ฌด๊ฐ mid ๋ณด๋ค ํด๋ ๋๋ฌด์ ๊ธธ์ด์์ mid๋ฅผ ๋นผ์ค๊ฐ์ tatalM์ ์ ์ฅํ๊ณ totalM์ด ๊ธฐ์ค๊ฐ m2 ๋ณด๋ค ํด๋ result์ mid ๊ฐ์ ๋น๊ต => ์ฌ๊ธฐ์ result์ ์ต์๊ฐ์ ์ฐพ์์ผํ๊ธฐ์ result์ mid ๊ฐ์ ์ ์ฅ
4. ์ดํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
+) ์ด๊ธฐ ๊ฒฐ๊ณผ ์ถ๋ ฅ์ ์์ด์ ๋ชจ๋ ๊ฐ๋ฅํ mid ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ resultList์ ์ ์ฅํ๊ณ max ํน์ min์ ์ด์ฉํด ์ถ๋ ฅํด์ฃผ๋ฉด ๊ฐํน runtime error ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ ์ฝ์คํ ์ด๊ณผ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ์ฌ์ฉ์ ์์ ํ๋ ๊ฒ์ด ์ข๋ค..(๊ทธ๋๋ ์ฌ์ฉํ ์ ์์ผ๋ฉด ํด์ผ๊ฒ ์ง๋ง)
'๐ฏ CodingTest > BaekJoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BaekJoon] 18111 ๋ง์ธํฌ๋ํํธ (0) | 2022.04.11 |
---|---|
[BaekJoon] 15829 Hashing (0) | 2022.04.11 |
[BaekJoon] 1654 ๋์ ์๋ฅด๊ธฐ (0) | 2022.04.11 |
[BaekJoon] 10845 ํ (0) | 2022.04.11 |
[BaekJoon] 1081 ์ซ์ ์นด๋ 2 (0) | 2022.04.11 |