๋๋ฌด ์๋ฅด๊ธฐ (silver 3)
์๊ทผ์ด๋ ๋๋ฌด M๋ฏธํฐ๊ฐ ํ์ํ๋ค. ๊ทผ์ฒ์ ๋๋ฌด๋ฅผ ๊ตฌ์ ํ ๊ณณ์ด ๋ชจ๋ ๋งํด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์, ์ ๋ถ์ ๋ฒ๋ชฉ ํ๊ฐ๋ฅผ ์์ฒญํ๋ค. ์ ๋ถ๋ ์๊ทผ์ด๋ค ์ง ๊ทผ์ฒ์ ๋๋ฌด ํ ์ค์ ๋ํ ๋ฒ๋ชฉ ํ๊ฐ๋ฅผ ๋ด์ฃผ์๊ณ , ์๊ทผ์ด๋ ์๋ก ๊ตฌ์ ํ ๋ชฉ์ฌ์ ๋จ๊ธฐ๋ฅผ ์ด์ฉํด์ ๋๋ฌด๋ฅผ ๊ตฌํ ๊ฒ์ด๋ค.
๋ชฉ์ฌ์ ๋จ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ค. ๋จผ์ , ์๊ทผ์ด๋ ์ ๋จ๊ธฐ์ ๋์ด H๋ฅผ ์ง์ ํด์ผ ํ๋ค. ๋์ด๋ฅผ ์ง์ ํ๋ฉด ํฑ๋ ์ด ๋ ์ผ๋ก๋ถํฐ H๋ฏธํฐ ์๋ก ์ฌ๋ผ๊ฐ๋ค. ๊ทธ ๋ค์, ํ ์ค์ ์ฐ์ํด์๋ ๋๋ฌด๋ฅผ ๋ชจ๋ ์ ๋จํด๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์, ๋์ด๊ฐ H๋ณด๋ค ํฐ ๋๋ฌด๋ H ์์ ๋ถ๋ถ์ด ์๋ฆด ๊ฒ์ด๊ณ , ๋ฎ์ ๋๋ฌด๋ ์๋ฆฌ์ง ์์ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด, ํ ์ค์ ์ฐ์ํด์๋ ๋๋ฌด์ ๋์ด๊ฐ 20, 15, 10, 17์ด๋ผ๊ณ ํ์. ์๊ทผ์ด๊ฐ ๋์ด๋ฅผ 15๋ก ์ง์ ํ๋ค๋ฉด, ๋๋ฌด๋ฅผ ์๋ฅธ ๋ค์ ๋์ด๋ 15, 15, 10, 15๊ฐ ๋ ๊ฒ์ด๊ณ , ์๊ทผ์ด๋ ๊ธธ์ด๊ฐ 5์ธ ๋๋ฌด์ 2์ธ ๋๋ฌด๋ฅผ ๋ค๊ณ ์ง์ ๊ฐ ๊ฒ์ด๋ค. (์ด 7๋ฏธํฐ๋ฅผ ์ง์ ๋ค๊ณ ๊ฐ๋ค) ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด๋ ์์ ์ ์ ๋๋ 0์ด๋ค.
์๊ทผ์ด๋ ํ๊ฒฝ์ ๋งค์ฐ ๊ด์ฌ์ด ๋ง๊ธฐ ๋๋ฌธ์, ๋๋ฌด๋ฅผ ํ์ํ ๋งํผ๋ง ์ง์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ค๊ณ ํ๋ค. ์ด๋, ์ ์ด๋ M๋ฏธํฐ์ ๋๋ฌด๋ฅผ ์ง์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด์ ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋๋ฌด์ ์ N๊ณผ ์๊ทผ์ด๊ฐ ์ง์ผ๋ก ๊ฐ์ ธ๊ฐ๋ ค๊ณ ํ๋ ๋๋ฌด์ ๊ธธ์ด M์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000)
๋์งธ ์ค์๋ ๋๋ฌด์ ๋์ด๊ฐ ์ฃผ์ด์ง๋ค. ๋๋ฌด์ ๋์ด์ ํฉ์ ํญ์ M๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ธฐ ๋๋ฌธ์, ์๊ทผ์ด๋ ์ง์ ํ์ํ ๋๋ฌด๋ฅผ ํญ์ ๊ฐ์ ธ๊ฐ ์ ์๋ค. ๋์ด๋ 1,000,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ ์ ๋๋ 0์ด๋ค.
์ถ๋ ฅ
์ ์ด๋ M๋ฏธํฐ์ ๋๋ฌด๋ฅผ ์ง์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด์ ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
4 7
20 15 10 17
์์ ์ถ๋ ฅ 1
15

num, length = map(int, input("๋๋ฌด์ ์, ๊ฐ์ ธ๊ฐ์ผ ํ๋ ๊ธธ์ด : ").split())
tree = list(map(int, input("๋๋ฌด์ ๋์ด : ").split()))
start = 0
end = max(tree)
# ์ด๋ถ ํ์ ์ด์ฉ
while start <= end:
len_sum = 0 # ๋๋ฌด ๊ธธ์ด์ ํฉ
mid = (start+end) // 2
for i in tree:
if i > mid: # ํ๊ท ๋ณด๋ค ๊ธด ๋๋ฌด๋ ์๋ฆผ
len_sum += i - mid
if len_sum >= length: # ์ํ๋ ๋๋ฌด์ ๊ธธ์ด๋ณด๋ค ๋ง์ด ์๋ ธ๋ค๋ฉด
start = mid + 1 # ์์์ ์กฐ์
else: # ์ํ๋ ๋๋ฌด์ ๊ธธ์ด๋ณด๋ค ๋ ์๋ ธ๋ค๋ฉด
end = mid - 1 # ๋์ ์กฐ์
print("์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ : ", end)
์ด๋ถ ํ์(Binary Search) ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ฃผ์๋ค.
์ด๋ถ ํ์
: ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์ ์์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ํฌ๊ธฐ์ ๋ ๋ถ๋ถ ๋ฆฌ์คํธ๋ก ๋๋๊ณ , ํ์ํ ๋ถ๋ถ์์๋ง ํ์ํ๋๋ก ์ ํํ์ฌ ์ํ๋ ์์๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ฆฌ์คํธ์ ์ค๊ฐ ๋ถ๋ถ์ ์ฐพ๋ ์์๊ฐ ์๋์ง ํ์ธ
- ์๋ค๋ฉด ์์ชฝ์ ์๋์ง ์๋์ชฝ์ ์๋์ง ํ๋จํ์ฌ ๋งจ ์๋ถํฐ ๊ฒ์ํ๊ฑฐ๋ ์ค๊ฐ๋ถํฐ ๊ฒ์ํ๋ค.
์์์ ๊ณผ ๋์ ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋์ while๋ฌธ์ด ์งํ๋๋๋ก ํด์ฃผ์๋ค.
mid๊ฐ์ ๋ฆฌ์คํธ์ ์ค๊ฐ ๋ถ๋ถ์ผ๋ก ์ ์ฅํ๊ณ , for๋ฌธ์ ์ฌ์ฉํด์ tree ๋ฆฌ์คํธ์ ์ ๋ ฅ ๋ฐ์ ์์์ ๋ํด ํ๊ท (mid)๋ณด๋ค ๊ธด ๋๋ฌด๋ ์๋ผ์ len_sum์ (๋๋ฌด๊ธธ์ด - ํ๊ท )๋งํผ ๋ํด์ฃผ์๋ค.
if๋ฌธ์ ์ฌ์ฉํด์ ์ํ๋ ๋๋ฌด์ ๊ธธ์ด length๋ณด๋ค ์๋ฅธ ๋๋ฌด์ ๊ธธ์ด len_sum์ด ๋ ํด ๊ฒฝ์ฐ ์์์ start๋ฅผ mid +1๋ก ์ ์ฅํด์ฃผ์๊ณ , ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ๋ ์ ์ ํด๋นํ๋ end๋ฅผ mid - 1๋ก ์กฐ์ ํด์ฃผ์๋ค.
๋ง์ง๋ง์ผ๋ก ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ์ธ end๋ฅผ ์ถ๋ ฅํด์ฃผ์๋ค.

'๋ฐฑ์ค > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Python] ๋ฐฑ์ค 1654๋ฒ (0) | 2022.05.31 |
|---|---|
| [Python] ๋ฐฑ์ค 11651๋ฒ (0) | 2022.05.25 |
| [Python] ๋ฐฑ์ค_4949๋ฒ (0) | 2022.05.15 |
| [Python] ๋ฐฑ์ค_ 4150๋ฒ (0) | 2022.05.08 |
| [Python] ๋ฐฑ์ค_2581๋ฒ (0) | 2022.05.08 |