ํ์ด
prices์ ๊ธธ์ด๊ฐ 100,000์ด๋ผ n^2์ผ๋ก ์ง๋ฉด ํฐ์ง ๊ฒ ๊ฐ์ stack์ผ๋ก ๊ตฌํํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋, ํน์ ์์๊ฐ ์กฐ์ฌํด์ผ ํ๋ ๋ถ๋ถ์ i+1๋ถํฐ ๋๊น์ง์ ์์์ด๋ค. ๊ทธ ๊ณผ์ ์์ ์ค๋ณต์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋๋ก ์ ๋ ฌํ๋ค ๊ฐ์ ๊ตฌํด์ฃผ์๋ค.
๊ทผ๋ฐ ๋ฌธ์ ๋, n^2์ผ๋ก ํ์ด๋ ํต๊ณผํ๋ค๋ ์ ์ด๋ค..ํ..
Code
def solution(prices):
# prices = [4, 3, 1, 4, 5, 2, 7, 2, 3, 4]
# prices = [1, 2, 3, 2, 3, 1]
reverse_prices = prices[::-1]
stack, ans = [], []
for i in range(len(reverse_prices)):
now = reverse_prices[i]
if not stack:
ans.append(0)
stack.append(now)
continue
last = stack[-1]
if now <= last:
# ์์ผ๋ก ๊ฐ๋ฉด์ ์ฐพ์
idx, count = len(stack)-1, 0
while idx >= 0:
if stack[idx] < now:
break
count += 1
idx -= 1
if idx < 0:
ans.append(count)
else:
ans.append(count+1)
stack.append(now)
else:
ans.append(1)
stack.append(now)
return ans[::-1]
ํ์ด 2
์ข ๋จ์ํ๊ฒ ๋ค์ ์๊ฐํด๋ดค๋ค. ๊ฒฐ๊ตญ ๋ฌธ์ ์๊ธฐ๋ ๊ฒ์ ๊ฐ๊ฒฉ์ด ๋์ด์ก์ ๋์ด๋ค. ๊ทธ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ฅผ ํด์ค๊น? ๊ฐ๊ฒฉ์ด ๋จ์ด์ง๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ์ง๊ธ ๊ฐ๊ฒฉ์ด์ ์ ๊ฐ๊ฒฉ๋ค์ ๋ณด๋ฉด์ ๊ทธ๋ฅ ๊ทธ ๊ฑฐ๋ฆฌ๊ฐ ์ผ๋ง์ธ์ง ์ฒดํฌํด์ค๋ค. ๊ทธ๋ฌ๋ฉด ์ด์ ๊ฐ๊ฒฉ๋ค ์ค์ ํ์ฌ ๊ฐ๊ฒฉ์ผ๋ก ์ธํด์ ๊ฐ๊ฒฉ์ด ๋จ์ด์ก๋ค๊ณ ํ๋จ๋ ๋ ์๋ค์ ์ด๋ฏธ ๋ต์ ๊ตฌํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ณผ ํ์๊ฐ ์๋ค.
์.. ๊ต์ฅํ ์ฌ์ด ๊ฒ์ด์๊ตฐ.. ์ด๊ฑฐ ๋ฐฑ์ค์์ ํ์ด๋ณธ ๊ธฐ์ต์ด ์๋ค. ์ผ๋จ index๋ฅผ stack์ ๋ฃ๋ ์์ด๋์ด. ๊ทธ๋ฆฌ๊ณ stack์์ ์์๋ฅผ ์ฆ๊ฐํ๋ ๋ฐฉํฅ์ผ๋ก ๋ง๋ค์ด์ ์์ ์ ์งํํ๋ ์์ด๋์ด๊ฐ ์๋ ๊ฒ์ด ๊ธฐ์ต๋๋ค.
code 2
def solution(prices):
ans, stack = [0] * len(prices), []
for now, price in enumerate(prices):
if stack:
while stack and price < prices[stack[-1]]: # ์คํ์์ ์์๊ฐ ์๊ณ , ํ์ฌ๊ฐ๊ฒฉ์ด ์ด์ ๊ฐ๊ฒฉ๋ณด๋ค ๋จ์ด์ก๋ค๋ฉด
past = stack.pop()
ans[past] = now-past
stack.append(now)
for i in stack: # ์ด์ ์คํ์ ๋น๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์ ์์๋ ์๊ฐ์. ์ง๊ธ๊น์ง ์ด์์๋ ์์๋ ๋๊น์ง ๋์๋๋ฐ๋ ๋จ์์๋ ๊ฒ๋ค์
ans[i] = len(prices)-(i+1) # ์ด ์๊ฐ์์ ํด๋น ๊ฐ๊ฒฉ์ ์๊ฐ์ ๋นผ์ค๋ค.
return ans