์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋ง์ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
1 ์ด | 256 MB | 16367 | 3904 | 2522 | 25.125% |
๋ฌธ์
ํ์คํ ๊ทธ๋จ์ ์ง์ฌ๊ฐํ ์ฌ๋ฌ ๊ฐ๊ฐ ์๋์ชฝ์ผ๋ก ์ ๋ ฌ๋์ด ์๋ ๋ํ์ด๋ค. ๊ฐ ์ง์ฌ๊ฐํ์ ๊ฐ์ ๋๋น๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ๋์ด๋ ์๋ก ๋ค๋ฅผ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด, ์ผ์ชฝ ๊ทธ๋ฆผ์ ๋์ด๊ฐ 2, 1, 4, 5, 1, 3, 3์ด๊ณ ๋๋น๊ฐ 1์ธ ์ง์ฌ๊ฐํ์ผ๋ก ์ด๋ฃจ์ด์ง ํ์คํ ๊ทธ๋จ์ด๋ค.
ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ๋์ด๊ฐ ํฐ ์ง์ฌ๊ฐํ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ ๋ ฅ์ ํ ์คํธ ์ผ์ด์ค ์ฌ๋ฌ ๊ฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ํ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ์ง์ฌ๊ฐํ์ ์ n์ด ๊ฐ์ฅ ์ฒ์์ผ๋ก ์ฃผ์ด์ง๋ค. (1 ≤ n ≤ 100,000) ๊ทธ ๋ค์ n๊ฐ์ ์ ์ h1, ..., hn (0 ≤ hi ≤ 1,000,000,000)๊ฐ ์ฃผ์ด์ง๋ค. ์ด ์ซ์๋ค์ ํ์คํ ๊ทธ๋จ์ ์๋ ์ง์ฌ๊ฐํ์ ๋์ด์ด๋ฉฐ, ์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ๊น์ง ์์๋๋ก ์ฃผ์ด์ง๋ค. ๋ชจ๋ ์ง์ฌ๊ฐํ์ ๋๋น๋ 1์ด๊ณ , ์ ๋ ฅ์ ๋ง์ง๋ง ์ค์๋ 0์ด ํ๋ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด์, ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ๋์ด๊ฐ ํฐ ์ง์ฌ๊ฐํ์ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ค.
๋์ ๋ต
์ฒซ๋ฒ์งธ ์ฝ๋
def calArea(dic):
max_result = 0
print(dic)
for key in dic:
for obj in dic[key]:
if obj*key>max_result:
max_result=obj*key
return max_result
def calMaxArea(l,h):
min = h[0]
tmp_dic = dict()
tmp_dic[min]=[1]
index = 1
arr = list()
arr.append(min)
past_renew = list()
for i in range(0,l-1):
past_renew = list(set(arr)) #์ค๋ณต ์์ ๊ธฐ
arr = []
if h[i]>=h[i+1]: # ์์ด ๋ค๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ
if h[i+1] in past_renew:
tmp_dic[h[i+1]].append(tmp_dic[h[i+1]].pop()+1)
elif h[i+1] in tmp_dic.keys():
tmp_dic[h[i+1]].append(2)
else:
tmp_dic[h[i+1]]=[2]
arr.append(h[i+1])
if h[i+1] in past_renew:
past_renew.remove(h[i+1])
if min>h[i+1]: # min ๊ฐฑ์
min = h[i+1]
if min in tmp_dic.keys():
tmp_dic[min].append(index)
else:
tmp_dic[min]=[index]
else: # ๋ค๊ฐ ๋ ํฐ ๊ฒฝ์ฐ
if h[i+1] in tmp_dic.keys():
tmp_dic[h[i+1]].append(1)
else:
tmp_dic[h[i+1]]=[1]
if h[i] in past_renew:
tmp_dic[h[i]].append(tmp_dic[h[i]].pop()+1)
elif h[i] in tmp_dic.keys():
tmp_dic[h[i]].append(2)
else:
tmp_dic[h[i]]=[2]
arr.append(h[i])
arr.append(h[i+1])
if h[i] in past_renew:
past_renew.remove(h[i])
if h[i+1] in past_renew:
past_renew.remove(h[i+1])
index+=1
tmp_dic[min].pop()
tmp_dic[min].append(index)
arr.append(min)
if min in past_renew:
past_renew.remove(min)
for obj in past_renew:
if obj <= h[i+1]:
if len(tmp_dic[obj])>=2: # ์ ์ฅ๋ value๊ฐ 2๊ฐ ์ด์์ด๋ฉด
tmp_dic[obj].append(tmp_dic[obj].pop()+1)
else:
tmp_dic[obj]=[tmp_dic[obj].pop()+1]
arr.append(obj)
return calArea(tmp_dic)
result = list()
while(1):
tmp = list(map(int,input().split()))
length = tmp[0]
if not(length):
break
height = tmp[1:]
result.append(calMaxArea(length,height))
for res in result:
print(res)
์๊ฐ ์ด๊ณผ
๋ด๊ฐ ์๊ฐํด๋ ๋๋ฌด ๋ณต์กํ๊ฒ ์ง ์ฝ๋๋ผ ์ค๋ช ์กฐ์ฐจ ๋ชปํ๊ฒ ๋ค..
๋๋ฒ์งธ ์ฝ๋
def calMaxArea():
global height
global area
if len(height)==1: # ๊ธฐ์ ์ฌ๋ก
if height[0]>area:
return height[0]
else:
return area
# ๊ฐ์ฅ ์์ ์๋ฅผ ๋ฐ์์
min_height = min(height) # O(h)
min_index = height.index(min_height)
cal_area = min_height*len(height)
if cal_area>area: # ๋ ํฐ ๊ฐ์ด ๋์ค๋ฉด ๊ฐฑ์
area = cal_area
# ๊ฐ์ฅ ์์ ๋์ด๊ฐ ์๋์ ์์นํ๋ฉด
if min_index ==0 or min_index == len(height)-1:
del height[min_index]
return calMaxArea()
else:
tmp_height = height[min_index+1:]
height = height[:min_index]
t1 = calMaxArea()
height = tmp_height
t2 = calMaxArea()
if t1>t2:
return t1
else:
return t2
# ์ต๋ 2log(n)๋ฒ
# ์ด O(hlog(n))
result = list()
while(1):
tmp = list(map(int,input().split()))
length = tmp[0]
if not(length):
break
height = tmp[1:]
area = 0
result.append(calMaxArea())
for res in result:
print(res)
๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ
๋ถํ ์ ๋ณต์ ์ฌ์ฉํ์๋ค.
O(hlogn)์ด ๋์ค๋๋ฐ์์ h์ ๋ฒ์๊ฐ ๋๋ฌด ํฐ ์์ด๋ฏ๋ก O(h)๊ฐ ๋์ค๋ min์ ๊ฐ์ ํ ํ์๊ฐ ์๋ค. min์ python ๊ธฐ๋ณธ ์ฐ์ฐ์๋ก O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ต์๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ์ค O(n) ์ดํ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง '์ธ๊ทธ๋จผํธ ํธ๋ฆฌ' ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค.
https://www.acmicpc.net/blog/view/9
๋ค๋ฅธ ๋ต
๊ฒฐ๊ตญ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋์์ ์ ๋ต ์ฝ๋๋ฅผ ์ฐพ์๋ณด์๋๋ https://joosjuliet.github.io/6549/ ์ด ๊ณณ์์ ๋จ 10์ค ์ ๋๋ก ๊ตฌํํ ์ฝ๋๊ฐ ์์๋ค ใ .. ๋๋จํ๋ค. ๋ผ์ธ ์ค์ํ + ์คํ ์๋ฃ๊ตฌ์กฐ ๋ฅผ ์ด์ฉํด์ ํ์๋ค. ๋ฐฉ๋ฒ์ ๋ณธ์ธ๊ณผ ๋น์ทํ ๊ฒ ๊ฐ์๋ฐ ํจ์ฌ ํ์ด์ฌ์ด๋ผ๋ ์ธ์ด์ ๋ํ ์ดํด๋๊ฐ ๊น์ ๊ฒ ๊ฐ์๋ค. ์๋์ ๊ทธ๋ฆผ์ ์ด ๋ธ๋ก๊ทธ์ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ดํดํ ๋๋ก ๊ทธ๋ ค๋ณธ ๊ฒ์ด๋ค.
=> ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋ ๊ฒ์ด ํธํจ
๋ํ ์ด ๋ฐฉ๋ฒ ๋ง๊ณ ๋ ๋ฐฑ์ค ๋ธ๋ก๊ทธ์์ ์ถ์ฒํ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ + ๋ถํ ์ ๋ณต ์ด๋ ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ + ๋ผ์ธ์ค์ํ ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅํ๋ค.
import math
def init(node, start, end):
global tree_list
global height
if start == end:
tree_list[node-1] = start
else:
init(node*2,start,(start+end)//2)
init(node*2+1,(start+end)//2+1,end)
if height[tree_list[node*2-1]]<height[tree_list[node*2]]:
tree_list[node-1] = tree_list[node*2-1]
else:
tree_list[node-1] = tree_list[node*2]
def query(node,start,end,i,j):
global tree_list
global height
if i>end or j<start: # ์ฃผ์ด์ง ๋ฒ์๊ฐ ์ ์ฒด ๋ฒ์์ ์์ ํ ์ํ์ง ์๋๋ค๋ฉด
return -1
if i<=start and end<=j: # ์ฃผ์ด์ง ๋ฒ์๊ฐ ์ ์ฒด ๋ฒ์๋ฅผ ์์ ํ ํฌํจํ๋ค๋ฉด
return tree_list[node-1] # ํด๋น ๋ฒ์์ ์ต์๊ฐ index๋ฅผ return ํจ
# ์ฃผ์ด์ง ๋ฒ์๊ฐ ์ ์ฒด ๋ฒ์์ ์ํด์๋ค๋ฉด
# ex_) 0~4 index์ ๊ฐ์ด ์ฃผ์ด์ก์ ๋, 1~3 index์ ๋ํ ์ต์๊ฐ์ ๊ตฌํ๊ณ ์ถ์
m1 = query(2*node,start,(start+end)//2,i,j) # ์ ์ฒด ๋ฒ์๋ฅผ ๋ฐ์ผ๋ก ์๋ฅธ ๋ฒ์๋ฅผ ๋๊ธฐ๊ณ ์ผ์ชฝ ๋
ธ๋ ๊ฐ์ ๋๊น
m2 = query(2*node+1,(start+end)//2+1,end,i,j) # ์ ์ฒด ๋ฒ์๋ฅผ ๋ฐ์ผ๋ก ์๋ฅธ ๋ฒ์๋ฅผ ๋๊ธฐ๊ณ ์ค๋ฅธ์ชฝ ๋
ธ๋ ๊ฐ์ ๋๊น
if m1==-1:
return m2
elif m2==-1:
return m1
else:
if height[m1]<=height[m2]:
return m1
else:
return m2
def maxArea(start, end):
global tree_list
global height
min_index = query(1,0,len(height)-1,start,end)
area = (end-start+1)*height[min_index]
if min_index-1>=start:
tmp = maxArea(start,min_index-1)
if tmp>area:
area = tmp
if min_index+1<=end:
tmp = maxArea(min_index+1,end)
if tmp>area:
area = tmp
return area
result = list()
while(1):
input_list = list(map(int,input().split()))
n = input_list[0]
if n==0:
break
height = input_list[1:]
tree_list = [0]*(pow(2,math.ceil(math.log(len(height),2))+1)-1)
init(1,0,n-1)
result.append(maxArea(0,n-1))
del tree_list
for obj in result:
print(obj)
๊ตฌํํด๋ณด์์ง๋ง ๊ณ์ ๋ฐํ์์ค๋ฅ๊ฐ ๋๋ค. ์ด์ ๋ long ํ์ ์ผ๋ก ๊ตฌ์ฑํ์ง ์์์ ์ธ ๊ฒ ๊ฐ์๋ฐ, python์ ์ ์ด์ ๋ฒ์๊ฐ intํ์ ์ด๊ณผํ๋ฉด ์๋์ผ๋ก longํ์ผ๋ก ๋ณํ๋๋ค๊ณ ํ๋ค. ๋ํ, long ํ์ ๊ฐ์ ์ ํ๋ณํ์ด ๋ฌด์จ ์ด์ ์์์ธ์ง ๋จนํ์ง ์๋๋ค. ใ ใ
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python]๋ฐฑ์ค 17827๋ฒ: ๋ฌํฝ์ด ๋ฆฌ์คํธ (0) | 2020.03.13 |
---|---|
[python]๋ฐฑ์ค 1699๋ฒ : ์ ๊ณฑ์์ ํฉ (0) | 2020.03.06 |
[python]๋ฐฑ์ค 1780๋ฒ : ์ข ์ด์ ๊ฐ์ (0) | 2020.03.06 |
[python]๋ฐฑ์ค 5620๋ฒ : ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ ์ ๊ฑฐ๋ฆฌ (0) | 2020.03.01 |
[python]๋ฐฑ์ค 1992๋ฒ : ์ฟผ๋ํธ๋ฆฌ (0) | 2020.02.29 |
Comment