โ๏ธ ๋ฌธ์
์๊ทผ์ด๋ ๋๋ฌด M๋ฏธํฐ๊ฐ ํ์ํ๋ค. ๊ทผ์ฒ์ ๋๋ฌด๋ฅผ ๊ตฌ์ ํ ๊ณณ์ด ๋ชจ๋ ๋งํด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์, ์ ๋ถ์ ๋ฒ๋ชฉ ํ๊ฐ๋ฅผ ์์ฒญํ๋ค. ์ ๋ถ๋ ์๊ทผ์ด๋ค ์ง ๊ทผ์ฒ์ ๋๋ฌด ํ ์ค์ ๋ํ ๋ฒ๋ชฉ ํ๊ฐ๋ฅผ ๋ด์ฃผ์๊ณ , ์๊ทผ์ด๋ ์๋ก ๊ตฌ์ ํ ๋ชฉ์ฌ์ ๋จ๊ธฐ๋ฅผ ์ด์ฉํด์ ๋๋ฌด๋ฅผ ๊ตฌํ ๊ฒ์ด๋ค.
๋ชฉ์ฌ์ ๋จ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค. ๋จผ์ , ์๊ทผ์ด๋ ์ ๋จ๊ธฐ์ ๋์ด H๋ฅผ ์ง์ ํด์ผ ํ๋ค. ๋์ด๋ฅผ ์ง์ ํ๋ฉด ํฑ๋ ์ด ๋ ์ผ๋ก๋ถํฐ H๋ฏธํฐ ์๋ก ์ฌ๋ผ๊ฐ๋ค. ๊ทธ ๋ค์, ํ ์ค์ ์ฐ์ํด์๋ ๋๋ฌด๋ฅผ ๋ชจ๋ ์ ๋จํด๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์, ๋์ด๊ฐ H๋ณด๋ค ํฐ ๋๋ฌด๋ H ์์ ๋ถ๋ถ์ด ์๋ฆด ๊ฒ์ด๊ณ , ๋ฎ์ ๋๋ฌด๋ ์๋ฆฌ์ง ์์ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด, ํ ์ค์ ์ฐ์ํด์๋ ๋๋ฌด์ ๋์ด๊ฐ 20, 15, 10, 17์ด๋ผ๊ณ ํ์. ์๊ทผ์ด๊ฐ ๋์ด๋ฅผ 15๋ก ์ง์ ํ๋ค๋ฉด, ๋๋ฌด๋ฅผ ์๋ฅธ ๋ค์ ๋์ด๋ 15, 15, 10, 15๊ฐ ๋ ๊ฒ์ด๊ณ , ์๊ทผ์ด๋ ๊ธธ์ด๊ฐ 5์ธ ๋๋ฌด์ 2์ธ ๋๋ฌด๋ฅผ ๋ค๊ณ ์ง์ ๊ฐ ๊ฒ์ด๋ค. (์ด 7๋ฏธํฐ๋ฅผ ์ง์ ๋ค๊ณ ๊ฐ๋ค) ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด๋ ์์ ์ ์ ๋๋ 0์ด๋ค.
์๊ทผ์ด๋ ํ๊ฒฝ์ ๋งค์ฐ ๊ด์ฌ์ด ๋ง๊ธฐ ๋๋ฌธ์, ๋๋ฌด๋ฅผ ํ์ํ ๋งํผ๋ง ์ง์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ค๊ณ ํ๋ค. ์ด๋, ์ ์ด๋ M๋ฏธํฐ์ ๋๋ฌด๋ฅผ ์ง์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด์ ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐ค ์ ์ถ๋ ฅ ์์
๐ง ๋์ด๋/์์ ์๊ฐ
- ๋์ด๋: solved.ac ๊ธฐ์ค S2
- ์์ ์๊ฐ: 19๋ถ → ์ด์ ๋์ ์๋ฅด๊ธฐ๋ฅผ ํ๊ณ ๋ด์ ๊ทธ๋ ์ง ์ด ๋ฌธ์ ๋ฅผ ๋จผ์ ๋ดค๋ค๋ฉด ์ธก์ ๋ถ๊ฐ์์ ๋ฏ
๐ก ํ์ด
์ด์ ์ฌ๋ฆฐ '๋์ ์๋ฅด๊ธฐ'์ ๋์ผํ ๋งค๊ฐ๋ณ์ ํ์ ์ ํ์ด๋ค. ๊ทธ๋์ ์ฝ๋ ํ์ ๊ทธ๋๋ก ์ฐ๊ณ ํ์ํ ๋ถ๋ถ๋ง ์ถ๊ฐํ๋ค.
(1) ์ฝ๋ by ๋
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
tree_heights = list(map(int, input().split()))
start, end = 1, max(tree_heights)
while start <= end:
mid = (start+end)//2
machine_height = 0
for tree in tree_heights:
if tree >= mid:
machine_height += (tree-mid)
if machine_height >= M:
start = mid+1
else:
end = mid-1
print(end)
Line 17: ์๋ฆฌ๊ณ ๋จ์ ๋๋ฌด์ ๊ธธ์ด๊ฐ 0 ๋ฏธ๋ง์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ฌด ๋์ด๊ฐ mid๋ณด๋ค ํฐ ๊ฒฝ์ฐ๋ง ์ฒ๋ฆฌํด์ ์๊ทผ์ด๊ฐ ๊ฐ์ ธ๊ฐ๋ ๋๋ฌด์ ๋ํด์คฌ๋ค. ์ด ๋ถ๋ถ์ด ์์ผ๋๊น ์์ ๋ต์ด ์ด์ํ๊ฒ ๋์์
๊ทผ๋ฐ ์ด ์ฝ๋๋ก ํต๊ณผ๋ ํ๋๋ฐ ์๊ฐ์ด ๋ฌด๋ ค 4224ms๋ ๊ฑธ๋ ค์ ์ฑ์งํผํฐ๊ฐ ์๋ ค์ค ์ฝ๋๋ฅผ ๋ฃ์ด๋ณด๋๊น ์ํ ์๊ฐ์ด ์ ๋ฐ ๋๊ฒ ์ค์๋ค.
(2) ์ฝ๋ by chatGPT
def get_wood_length(trees, height):
total = 0
for tree in trees:
if tree > height:
total += tree - height
return total
def find_max_saw_height(trees, target):
left, right = 0, max(trees)
result = 0
while left <= right:
mid = (left + right) // 2
wood = get_wood_length(trees, mid)
if wood >= target:
result = mid # ํ์ฌ ๋์ด์์ ๋๋ฌด๋ฅผ ์ถฉ๋ถํ ๊ฐ์ ธ๊ฐ ์ ์์ผ๋ฉด, ๋ ๋์ ๋์ด๋ ํ์ธ
left = mid + 1
else:
right = mid - 1
return result
# ์
๋ ฅ ๋ฐ๊ธฐ
N, M = map(int, input().split())
trees = list(map(int, input().split()))
# ์ต๋ ์ ๋จ๊ธฐ ๋์ด ์ถ๋ ฅ
print(find_max_saw_height(trees, M))
๋ด๊ฐ ์๊ฐํ๋ ์ด ์ฝ๋์ ๋ด ์ฝ๋์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋๋ฌด๋ง๋ค ์๋ผ๋ด๋ ๊ณผ์ ์ ํจ์ํ์ด๋ค. ๋ฐ๋ก ์ฑ์งํผํฐํํ ๋ ์ฝ๋์ ์ํ ์๊ฐ์ด ์ด๋ ๊ฒ๋ ์ฐจ์ด๊ฐ ๋ง์ด ๋๋ ์ด์ ๋ฌผ์ด๋ด
ํ๋ก๊ทธ๋๋จธ์ค์์ ๋ฌธ์ ํ ๋๋ ์ข ๋ํ๋ฐ, ๋ฐฑ์ค์์ ๋ฌธ์ ํ ๋๋ ํจ์๋ฅผ ๊ฑฐ์ ์ฌ์ฉํ์ง ์๋๋ค. ํจ์๋ฅผ ์ ์จ์ผ๊ฒ ๋ค๊ณ ๋ค์งํ๊ฒ ๋๋ ๋ฌธ์ ์๋ค.
'Problem Solving > BOJ & Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 3135๋ฒ: ๋ผ๋์ค (0) | 2024.09.24 |
---|---|
[BOJ] 4659๋ฒ: ๋น๋ฐ๋ฒํธ ๋ฐ์ํ๊ธฐ (0) | 2024.09.21 |
[BOJ] 1654๋ฒ: ๋์ ์๋ฅด๊ธฐ (1) | 2024.09.18 |
[BOJ] 7568๋ฒ: ๋ฉ์น (0) | 2024.09.09 |
[BOJ] 9095๋ฒ: 1, 2, 3 ๋ํ๊ธฐ (0) | 2024.09.03 |