DOing
[์๊ณ ๋ฆฌ์ฆ] ์ด์งํ์ with Python ๋ณธ๋ฌธ
๐ก ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ
ํ์ ๋ฒ์๋ฅผ ๋ฐ์ผ๋ก ์ขํ๊ฐ๋ฉฐ ๋น ๋ฅด๊ฒ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋จ, ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์์ด์ผ์ง๋ง ์ฌ์ฉํ ์ ์๋ค.
์์ฐจํ์์ ์๊ฐ ๋ณต์ก๋๋ O(N)์ด์ง๋ง ์ด์งํ์์ ์๊ฐ๋ณต์ก๋๋ O(logN)์ผ๋ก ๋น ๋ฅด๊ฒ ํ์์ด ๊ฐ๋ฅํ๋ค.
๋ง์ฝ ๋ฐ์ดํฐ์ ํ์ ๋ฒ์๊ฐ 2,000๋ง์ด ๋์ด๊ฐ๋ฉด ์ด์งํ์์ผ๋ก ๋ฌธ์ ์ ์ ๊ทผํด๋ณด๋ ๊ฒ์ด ์ข๋ค.
๐ก ์ด์ง ํ์ ๋์๊ณผ์
1. ์์์ ๊ณผ ๋์ ์ฌ์ด์ ์ค๊ฐ์ ์ ์ง์ ํ๋ค. ์ค๊ฐ์ ์ด ์ค์๋ผ๋ฉด ์์์ ์ดํ๋ ๋ฒ๋ฆฐ๋ค.
2. ์ค๊ฐ์ ๊ณผ ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ๋ค.
3. ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ์ ๋ณด๋ค ํฌ๋ค๋ฉด ์์์ ์ ์ค๊ฐ์ ์ดํ๋ก ๋ณ๊ฒฝํ๋ค.
4. ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ์ ๋ณด๋ค ์๋ค๋ฉด ๋์ ์ ์ค๊ฐ์ ์ดํ๋ก ๋ณ๊ฒฝํ๋ค.
5. ์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ๊ฐ ์ค๊ฐ์ ๊ณผ ์ผ์นํ ๋๊น์ง 1~4๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ๊ฐ 2๋ผ๊ณ ๊ฐ์ ํ๊ณ ๋์๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณด์.
๐ก ์ด์ง ํ์ ๊ตฌํ ์ฝ๋
[ ๋ฐ๋ณต๋ฌธ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ ]
def binary_search(array, target, start, end):
while start<=end:
mid = (start+end)//2 # ์์์ ์ดํ๋ ๋ฒ๋ฆผ
# ํ์์ฑ๊ณต
if array[mid] == target:
return mid
# ์ค๊ฐ์ ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ผ์ชฝ ํ์ธ
elif array[mid] > target:
end = mid-1
# ์ค๊ฐ์ ๊ฐ๋ณด๋ค ์ฐพ๊ณ ์ ํ๋ ๊ฐ์ด ํฐ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ํ์ธ
else:
start = mid+1
return None # ํ์์ด ๋๋ฌ์ผ๋ ์ฐพ์ง ๋ชปํ๋ค.
[ ์ฌ๊ทํจ์๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ]
def binary_search(array, target, start, end):
if start>end:
return None
mid = (start+end)//2 # ์์์ ์ดํ ๋ฒ๋ฆผ
if array[mid] == target: #ํ์ ์ฑ๊ณต
return mid
# ์ค๊ฐ์ ๊ฐ๋ณด๋ค ์๋ค๋ฉด ์ผ์ชฝ ํ์ธ
elif array[mid]>target:
return binary_search(array, target, start, mid-1)
# ์ค๊ฐ์ ๊ฐ๋ณด๋ค ํฌ๋ฉด ์ค๋ฅธ์ชฝ ํ์ธ
else:
return binary_search(array, target, mid+1, end)
๐ก ์ด์ง ํ์ ํธ๋ฆฌ
์ด์ง ํ์ ํธ๋ฆฌ๋ ์ด์ง ํ์์ด ๋์ํ ์ ์๋๋ก ๊ณ ์๋, ํจ์จ์ ์ธ ํ์์ด ๊ฐ๋ฅํ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ฐ์ ํธ๋ฆฌ๋, Node์ Branch๋ฅผ ์ด์ฉํด์, ์ฌ์ดํด์ ์ด๋ฃจ์ง ์๋๋ก ๊ตฌ์ฑํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์๋ฏธํ๋ค.
์ด์ง ํธ๋ฆฌ๋, Node์ Branch๊ฐ 2์ธ ํธ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
๋ง์ง๋ง์ผ๋ก ์ด์ง ํ์ ํธ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ถ๊ฐ์ ์ธ ์กฐ๊ฑด์ด ์๋ ์ด์งํธ๋ฆฌ์ด๋ค.
1) ๋ชจ๋ ๋ ธ๋๋ ์ผ์ชฝ ๊ฐ์ง์ ํฌํจ๋๋ ์ด๋ ํ ์ซ์๋ณด๋ค๋ ํฌ๋ค.
2) ๋ชจ๋ ๋ ธ๋๋ ์ค๋ฅธ์ชฝ ๊ฐ์ง์ ํฌํจ๋๋ ์ด๋ ํ ์ซ์๋ณด๋ค๋ ์๋ค.
๐ก ํ์ด์ฌ ์ด์ง ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ์ด์ฌ์์๋ ์ด์ง ํ์์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก bisect ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ฅผ ์ด์ฉํด์ ์ ๋ ฌ๋ ๋ฐฐ์ด์์ ํน์ ๋ฒ์์ ์ํ๋ ๋ฐ์ดํฐ ๊ฐฏ์๋ฅผ ๊ตฌํ๊ฑฐ๋ ํน์ ๊ฐ์ ๋ฐ์ดํฐ ๊ฐฏ์๋ฅผ ๊ตฌํ ์ ์๋ค.
- bisect_left(a, x) : ๋ฆฌ์คํธ a์ ๋ฐ์ดํฐ x๋ฅผ ์ฝ์ ํ ๊ฐ์ฅ ์ผ์ชฝ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๋ฉ์๋
- bisect_right(a, x) : ๋ฆฌ์คํธ a์ ๋ฐ์ดํฐ x๋ฅผ ์ฝ์ ํ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๋ฉ์๋
from bisect import bisect_left, bisect_right
def count_by_range(a, left_value, right_value):
left_index = bisect_left(a, left_value)
right_index = bisect_right(a, right_value)
return right_index - left_index
a = [1,2,4,4,5]
# ๊ฐ์ด 4์ธ ๋ฐ์ดํฐ ๊ฐฏ์
print(count_by_range(a,4,4))
# ๊ฐ์ด 4~5์ธ ๋ฐ์ดํฐ ๊ฐฏ์
print(count_by_range(a,4,5))
๐ก ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์
Q1. ๋ก๋ณถ์ด ๋ก ๋ง๋ค๊ธฐ
๋๋น์ด๋ค ๋ก๋ณถ์ด ๋ก์ ๋ก๋ณถ์ด ๋ก์ ๊ธธ์ด๊ฐ ์ผ์ ํ์ง ์๋ค. ๋์ ์ ํ๋ด์ง ์์ ๋ค์ด๊ฐ๋ ๋ก์ ์ด๊ธธ์ด๋ ์ ๋จ๊ธฐ๋ก ์๋ผ์ ๋ง์ถฐ์ค๋ค. ์ ๋จ๊ธฐ์ ๋์ด (H)๋ฅผ ์ง์ ํ๋ฉด ์ค์ง์ด์ง ๋ก์ ํ๋ฒ์ ์ ๋จํ๋ค. ๋์ด๊ฐ H๋ณด๋ค ๊ธด ๋ก์ H์์ ๋ถ๋ถ์ด ์๋ฆด ๊ฒ์ด๊ณ ๋ฎ์ ๋ก์ ์๋ฆฌ์ง ์๋๋ค.
์๋ฅผ ๋ค์ด ๋์ด๊ฐ 19, 14, 10, 17cm์ธ ๋ก์ด ๋๋ํ ์๊ณ ์ ๋จ๊ธฐ ๋์ด๋ฅผ 15cm๋ผ๊ณ ํ๋ฉด ์๋ฅธ ๋ค ๋ก์ ๋์ด๋ 15, 14, 10, 15cm๊ฐ ๋ ๊ฒ์ด๋ค. ์๋ฆฐ ๋ก์ ๊ธธ์ด๋ ์ฐจ๋ก๋๋ก 4, 0, 0, 2cm์ด๋ค. ์๋์ 6cm๋งํผ์ ๊ธธ์ด๋ฅผ ๊ฐ์ ธ๊ฐ๋ค.
์๋์ด ์์ ๋ ์์ฒญํ ์ด ๊ธธ์ด๊ฐ M์ผ๋ ์ ์ด๋ M๋งํผ์ ๋ก์ ์ป๊ธฐ ์ํด ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
* ์ ๋ ฅ ์กฐ๊ฑด
- ์ฒซ์งธ์ค์ ๋ก์ ๊ฐฏ์ N๊ณผ ์์ฒญํ ๋ก์ ๊ธธ์ด M์ด ์ฃผ์ด์ง๋ค. (1<=N<=1,000,000, 1<=M<=2,000,000,000)
- ๋์งธ์ค์๋ ๋ก์ ๊ฐ๋ณ ๋์ด๊ฐ ์ฃผ์ด์ง๋ค. ๋ก ๋์ด์ ์ดํฉ์ ํญ์ M์ด์์ด๋ฏ๋ก, ์๋์ ํ์ํ ์๋งํผ ๋ก์ ์ฌ๊ฐ ์ ์๋ค. ๋์ด๋ 10๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ ์ ์ ๋๋ 0์ด๋ค.
* ์ถ๋ ฅ ์กฐ๊ฑด
- ์ ์ด๋ M๋งํผ์ ๋ก์ ์ง์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด ์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
* ์ ๋ ฅ ์์
4 6
19 15 10 17
* ์ถ๋ ฅ ์์
15
[๋ฌธ์ ์์ด๋์ด]
์ ๋จ๊ธฐ์ ์ค์ ํ ์ ์๋ ๋์ด(H)์ ๋ฒ์๋ 1~ ์์ฒญํ ๋ก์ ๊ธธ์ด(M)๊น์ง์ด๋ค.
์ด๋ ์์ฒญํ ๋ก์ ๊ธธ์ด(M)์ ๋ฒ์๊ฐ 20์ต๊น์ง์ด๊ธฐ ๋๋ฌธ์ ์์ฐจํ์์ด์๋ ์ด์งํ์์ผ๋ก ์ ๊ทผํด์ผํ๋ค.
[์ฝ๋]
n, m = map(int, input().split())
rice = list(map(int, input().split()))
start = 0
end = max(rice)
result = 0
# ์ ๋จ๊ธฐ ๋์ด ์ด์ง ํ์
# ์ฐ์ฐ์ ์ํํ ์๋ก ์ต์ ํ๋ ๊ฐ์ ์ฐพ์ ์ ์๋ค
while start <= end:
h = (start+end)//2
total = 0
# ์ ํ ์ ๋จ๊ธฐ ๋์ด ๊ฐ์ผ๋ก ์๋ผ๋ณธ๋ค
for i in range(n):
# ์ ๋จ๊ธฐ ๋์ด ๋ณด๋ค ๊ธด ๋ก๋ง ์๋ฅธ๋ค
if rice[i] > h:
total += rice[i] - h
# ์๋์ด ์ํ๋ ๊ฐ์ ์ ํํ ์ผ์น
if total == m:
break
# ์๋์ด ์ํ๋ ๋ก์ด ์ถฉ๋ถํ๋ค
elif total > m:
# ์ค ์๋ ์๋ ์ํฉ์ด์ง๋ง ๋ ์ ๊ฒ ๋จ๊ธฐ๋ ์ ๋จ๊ธฐ ๋์ด๋ฅผ ํ์
start = h+1
result = h # ์ค ์๋ ์์ผ๋ ์ผ๋จ ์ ์ฅํด๋์ผํ๋ค
# ์๋์ด ์ํ๋ ๋ก์ด ๋ถ์กฑํ๋ค
else :
end = h-1
print(h)
์ถ์ฒ:
์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค(์ด๋๋น ์ )
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ ์ต๋จ๊ฒฝ๋ก with Python (0) | 2021.05.23 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ with Python (0) | 2021.05.23 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ with Python (1) | 2021.05.22 |
[์๊ณ ๋ฆฌ์ฆ] BFS with Python (1) | 2021.05.22 |
[์๊ณ ๋ฆฌ์ฆ] DFS with Python (0) | 2021.05.22 |