๐Ÿถ Programming/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€๊ธฐ

BOJ. 1725 ํžˆ์Šคํ† ๊ทธ๋žจ (Python)

์ง€ ์› 2022. 10. 3. 10:28

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