https://www.acmicpc.net/problem/2493
재밌는 문제! 근데 시간 초과가 자꾸 떠서 결국은 구글링.
# PYTHON CODE (1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import sys
from collections import deque
n = int(sys.stdin.readline())
s = list(map(int, sys.stdin.readline().split()))
stk1 = deque(s)
stk2 = deque()
answer = []
for _ in range(n - 1):
a = stk1.pop()
while stk1:
if a <= stk1[-1]:
break
else:
stk2.appendleft(stk1.pop())
answer.append(len(stk1))
stk1 = stk1 + stk2
stk2 = deque([])
answer += [0]
for i in answer[::-1]:
print(i, end=' ')
|
cs |
이게 첫번째 코드였는데, 스택을 두가지로 이용하는 방법이었다. zip이나 enumerate를 이용해 탑의 인덱스를 도출하려 했으나 남은 스택의 길이로 대신하는게 더 효율적인 것 같아서 len으로 구현해봤으나, 훨씬 효율적인 길이 있더라.
정답은 잘 나왔지만 시간 초과로 다른 방법을 찾아봤다.
# PYTHON CODE (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import sys
n = int(sys.stdin.readline())
s = list(map(int, sys.stdin.readline().split()))
result = [0 for _ in range(n)]
stk = []
for i in range(n):
a = s[i]
while stk and s[stk[-1]] < a:
stk.pop()
if stk:
result[i] = stk[-1] + 1
stk.append(i)
print(' '.join(map(str, result)))
|
cs |
이 코드의 요지는 탑 왼쪽에 자기보다 낮은 높이의 탑은 존재할 필요가 없다는 것.
굳이 무리해서 탑의 순서를 구하지 않고, 인덱스에 1을 더해주며 깔끔히 마무리한다.
엄청 복잡한 문제는 아니어서 여기까지.
'백준 > 스택' 카테고리의 다른 글
[Python] 백준, 17298(스택) (0) | 2021.07.28 |
---|---|
[Python] 백준, 5397(스택) (0) | 2021.07.27 |
[Python] 백준, 2504(스택) (0) | 2021.07.26 |
[Python] 백준, 1406(스택) (0) | 2021.07.23 |
[Python] 백준, 10773, 10799(스택) (0) | 2021.07.22 |