[๋ฐฑ์ค] 2493๋ฒ. ํ ๐ผ
์์ด๋์ด
- ์ฒ์์ ๊ทธ๋ฅ ๋ด ๋ค์๋ฒ์ ๋์ค๋ ๋๋ณด๋ค ํฐ ํ์ด ๋์ฌ๋๊น์ง ๋ฐ๋ณต๋ฌธ์ ๋๋ ธ๋๋ฐ ์๊ฐ์ด๊ณผ ๋ฌ๋ค..
stack
์ ์ด์ฉํด์ ํธ๋ ์ ํ์ ์ธ ๋ฌธ์ ์๋ค..... ์์ง ๋ด ์์ค์์ ์๊ฐํด๋ด์ง ๋ชปํ ๊ฒ ๊ฐ๋ค.... ๐คฏ
- ๋ ์ด์ ๋ฅผ ์๋ ๋ฐฉํฅ ๋ฐ๋๋ก(์ผ โ ์ค) ํ์ํ๋ฉด์ ๋ณด์กฐ
stack
์ ๋ฃ๋๋ค.
ํ์ฌ ๋ ์ด์ ๋ฅผ ์๋ ํ
๊ณผ stack์ ๋ง์ง๋ง(top) ๊ฐ
์ ๋น๊ตํ์ฌ ๋ ์ด์ ๋ฅผ ์์ ํ ์ ์๋์ง ์ฒดํฌํ๋ค.
2-1. ์์ ํ ์ ์๋ค๋ฉด(์ผ์ชฝ ํ(stack[-1]
)์ด ๋ ํฌ๋ค๋ฉด), ๊ทธ ํ์ ์ธ๋ฑ์ค๋ฅผ result
๋ฆฌ์คํธ์ ๋ฃ์ด์ฃผ๊ณ
2-2. ์์ ํ ์ ์๋ค๋ฉด(๋ ์์ ํ์ด๋ผ๋ฉด), ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋ก pop()
ํด์ค๋ค.
stack
์ ๊ทธ ๊ฒ์ฌ๋ฅผ ๋ง์น ํ์ ๋ฃ์ด์ค๋ค.
- 1-3์ ๋ฐ๋ณตํ๋ค.
stack | ์ผ์ชฝ ํ | ์ ์ ์๋์ง ์ฌ๋ถ(> ) | ํ์ฌ ํ | ํ ๋ฆฌ์คํธ | result |
---|
[] | - | False | 6 | [9, 5, 7, 4] | [0] |
[6] | 6 | False | 9 | [5, 7, 4] | [0, 0] |
[9] | 9 | True | 5 | [7, 4] | [0, 0, 2] |
[9, 5] | 5 | False | 7 | [4] | [0, 0, 2] |
[9] | 9 | True | 7 | [4] | [0, 0, 2, 2] |
[9, 7] | 7 | True | 4 | [] | [0, 0, 2, 2, 4] |
stack
์ ๋ฆฌ์คํธ
๋ก ์ฌ์ฉํ์ง๋ง๊ณ deque
์ ์ฌ์ฉํ๋ฉด ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋ค. ๐กpop()์ ์ธ ๋ ์ต๋ํ deque์ ์ฐ์!!
list.pop()
: O(N)
deque.pop()
: O(1)
์๊ฐ ๋ณต์ก๋
์ฝ๋
from collections import deque
import sys
input = sys.stdin.readline
n = int(input())
towers = [(i + 1, t) for i, t in enumerate(map(int, input().split()))]
stack = deque([towers[0]])
result = [0]
for j in range(1, n):
tower = towers[j][1]
razer = 0
while stack:
if tower > stack[-1][1]:
stack.pop()
else:
razer = stack[-1][0]
break
stack.append((j + 1, tower))
result.append(razer)
print(*result)
import sys
input = sys.stdin.readline
n = int(input())
towers = [(i + 1, t) for i, t in enumerate(map(int, input().split()))]
stack = [towers[0]]
result = [0]
for j in range(1, n):
tower = towers[j][1]
razer = 0
while stack:
if tower > stack[-1][1]:
stack.pop()
else:
razer = stack[-1][0]
break
stack.append((j + 1, tower))
result.append(razer)
print(*result)
- ์๊ฐ์ด๊ณผ ์ฝ๋ (
O(N^2)
)
import sys
input = sys.stdin.readline
n = int(input())
stack = list(map(int, input().split()))
stack.reverse()
result = []
for i, tower in enumerate(stack):
answer = 0
for j in range(i + 1, n):
if tower <= stack[j]:
answer = n - j
break
result.append(answer)
result.reverse()
print(*result)