BOJ 1725. ํ์คํ ๊ทธ๋จ
๋ฌธ์
https://www.acmicpc.net/problem/1725
1725๋ฒ: ํ์คํ ๊ทธ๋จ
์ฒซ ํ์๋ N (1 โค N โค 100,000) ์ด ์ฃผ์ด์ง๋ค. N์ ํ์คํ ๊ทธ๋จ์ ๊ฐ๋ก ์นธ์ ์์ด๋ค. ๋ค์ N ํ์ ๊ฑธ์ณ ๊ฐ ์นธ์ ๋์ด๊ฐ ์ผ์ชฝ์์๋ถํฐ ์ฐจ๋ก๋๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ์นธ์ ๋์ด๋ 1,000,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์
www.acmicpc.net
๐ธ ์ ๊ทผ ๋ฐฉ๋ฒ
๊ฐ์ฅ ํฐ ๋์ด๋ฅผ ๊ฐ์ง๋ ์ง์ฌ๊ฐํ์ ๊ตฌํ๊ธฐ ์ํด์๋ ๊ตฌ๊ฐ๋ณ๋ก, ๊ฐ์ฅ ์์ ์ง์ฌ๊ฐํ์ ๋์ด๋ฅผ ๊ตฌํ ํ์ ๊ทธ ๊ตฌ๊ฐ์ ๊ธธ์ด๋งํผ (๊ฐ๋ก๊ธธ์ด) ๊ณฑํด์ฃผ๋ฉด ๋๋ค๊ณ ์๊ฐํ๋ค.
๊ตฌ๊ฐ๋ณ๋ก ๊ฐ์ฅ ์์ ๋์ด๋ฅผ ๊ฐ์ง๋ ์ง์ฌ๊ฐํ์ index๊ฐ์ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์ ์ฅํ๊ณ , ๋ถํ ์ ๋ณต์ ์ฌ์ฉํด์ ๊ฐ์ฅ ์์ ์ง์ฌ๊ฐํ์ ์ฌ์ฉํด ๋์ด๋ฅผ updateํ ํ์๋ ๊ฐ๊ฐ ์ข, ์ฐ ๊ตฌ๊ฐ์ผ๋ก ๋๋์ด์ update๋ฅผ ๋ฐ๋ณตํ๋ค.
์ด ๊ณผ์ ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ตฌ๊ฐ๋ณ๋ก ๊ฐ์ฅ ์์ ๋์ด ๊ฐ์ ๊ฐ์ง๋ ์ง์ฌ๊ฐํ์ index๊ฐ ์ ์ฅํ๊ธฐ
- ์ ์ฒด ๊ตฌ๊ฐ์์๋ถํฐ ๊ฐ์ฅ ์์ ์ง์ฌ๊ฐํ์ ๋์ด๊ฐ * ๊ทธ ๊ตฌ๊ฐ์ ๊ธธ์ด๋ฅผ ์ฌ์ฉํด ๊ตฌ๊ฐ์์ ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ๋์ด๊ฐ ๊ตฌํ๊ธฐ
- ๋์ด ๊ฐ์ updateํ์ผ๋ฉด ๋ถํ ์ ๋ณต์ ์ฌ์ฉํด์ ์ข, ์ฐ๋ก ๊ตฌ๊ฐ ๋๋ ์ ๋์ด๊ฐ ๋น๊ตํ๊ธฐ
- ์ ์ฒด, ์ข, ์ฐ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ๋์ด ๊ฐ์ผ๋ก ์ ์ฅํ๊ธฐ
# 1725 ํ์คํ ๊ทธ๋จ
# 221002
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
def init(node, s, d):
if s == d:
tree[node] = s
return tree[node]
mid = (s+d)//2
idx1 = init(node*2, s, mid)
idx2 = init(node*2 + 1, mid+1, d)
if arr[idx1] < arr[idx2]:
tree[node] = idx1
else:
tree[node] = idx2
return tree[node]
# ์ต์ ์ธ๋ฑ์ค -> ๋์ด๊ฐ ์ฐพ๊ธฐ
def findMin(node, s, d, l, r):
if d < l or r < s:
return -1
if l <= s and d <= r:
return tree[node]
else:
mid = (s+d)//2
idx1 = findMin(node*2, s, mid, l, r)
idx2 = findMin(node*2 + 1, mid+1, d, l, r)
if idx1 == -1:
return idx2
elif idx2 == -1:
return idx1
else:
if arr[idx1] < arr[idx2]:
return idx1
else:
return idx2
# idx l~r ์ง์ฌ๊ฐํ ์ค์์ ๊ฐ์ฅ ์์ index * ๊ตฌ๊ฐ ๊ฐ๋ก ๊ธธ์ด (r-l+1)
def maxArea(l, r):
if l == r:
return arr[l]
minIdx = findMin(1, 1, N, l, r)
area = arr[minIdx] * (r-l+1)
if l <= minIdx-1:
area1 = maxArea(l, minIdx-1)
if area < area1:
area = area1
if minIdx+1 <= r:
area2 = maxArea(minIdx+1, r)
if area < area2:
area = area2
return area
N = int(input())
arr = [0] + [int(input()) for _ in range(N)]
i = 0
while True:
if N > 2**i:
i += 1
else:
i += 1
break
tree = [0] * (2**i)
# ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ์ ๊ตฌ๊ฐ๋ณ ์ต์ ๋์ด๋ฅผ ๊ฐ์ง๋ ๋ธ๋ญ์ idx ์ ์ฅ
init(1, 1, N)
# ์ ๋ต ๋ณ์
answer = maxArea(1, N)
print(answer)
๐ Key Point
๐ธ ๊ฐ์ ์ ์ฅํ ๋, ๊ฐ์ฅ ์์ ๋์ด ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ด ์๋ index๊ฐ์ ์ ์ฅํด์ผ ๊ตฌ๊ฐ์ ๋ถํ ํ ๋ ์จ๋จน์ ์ ์๋ค. ๋์ด ๊ฐ์ผ๋ก ์ ์ฅํ๋ฉด `.index` ๋ฅผ ์ฌ์ฉํด์ ๋ index๋ฅผ ์ฐพ์์ผํ๋ค.
๐ธ ๋ถํ ์ ๋ณต์ ํ ๋, ๊ตณ์ด ๊ตฌ๊ฐ์ returnํด์ ๋ ํธ์ถํ์ง ๋ง๊ณ ๊ณ์ฐํ ๊ฐ์ ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ ํจ์ฌ ๊น๋ํ๊ฒ ํจ์๋ฅผ ๊ตฌํํ ์ ์์๋ค!
์ด ๋ฌธ์ ์ ๋ํ ํ์ด๋ ๋ฐฑ์ค ๋ธ๋ก๊ทธ์ ๋ด๊ฐ ์ฌ์ฉํ ๋ถํ ์ ๋ณต, ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ ๋ฐฉ์๊ณผ ์คํ ๋ฐฉ์ ๋๊ฐ๊ฐ ๋ค ์ ๋ฆฌ ๋์ด์์ผ๋ ๊ทธ๊ฑธ ์ฐธ๊ณ ํ๋ ๊ฒ๋ ์ถ์ฒํ๋ค.
< ๋ฐฑ์ค ๋ธ๋ก๊ทธ >
https://www.acmicpc.net/blog/view/12
ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ
6549๋ฒ ๋ฌธ์ : ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ๋ฌธ์ ํ์คํ ๊ทธ๋จ์์ ๋ชจ๋ ๋ง๋์ ๋๋น๋ 1์ด๊ณ , ๋์ด๋ hi์ผ ๋, ๊ฐ์ฅ ๋์ด๊ฐ
www.acmicpc.net
'๐ถ Programming > ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ. 9095 1, 2, 3 ๋ํ๊ธฐ (Python) (2) | 2022.12.05 |
---|---|
BOJ. 12100 2048 (Easy) (Python) (3) | 2022.10.07 |
2021 ์นด์นด์ค ์ฑ์ฉ์ฐ๊ณํ ์ธํด์ญ Lv2. ๊ฑฐ๋ฆฌ๋๊ธฐ ํ์ธํ๊ธฐ (0) | 2022.09.11 |
2021 ์นด์นด์ค ์ฑ์ฉ์ฐ๊ณํ ์ธํด์ญ Lv1. ์ซ์ ๋ฌธ์์ด๊ณผ ์๋จ์ด (0) | 2022.07.17 |
2022 KAKAO BLIND RECRUITEMENT Lv2. ์๊ถ๋ํ (0) | 2022.07.17 |