728x90
반응형
https://www.acmicpc.net/problem/6198
Python
import sys
arr = [ int(sys.stdin.readline()) for _ in range(int(sys.stdin.readline())) ]
stack = []
ans = [0]*len(arr)
for i in range(len(arr)):
if stack and stack[-1][0] <= arr[i]:
for s in stack[:-1]:
ans[s[1]] = stack[-1][1] - s[1]
while stack and stack[-1][0] <= arr[i]:
stack.pop()
stack.append((arr[i],i))
#print(stack)
for s in stack[:-1]:
ans[s[1]] = stack[-1][1] - s[1]
print(sum(ans))
시간 초과
값을 하나 추가할 때마다
스택을 한 번씩 훑어보며 그 거리를 계산하니 발생한 문제였다.
5
5
4
3
2
1 이와 같은 예제에서 n!이나 걸리게 된다
그래서
위의 정답 코드를 보면 알다시피
값을 삭제해야하는 첫 순간에만 거리를 계산하도록 바꾸었다.
이 때 마지막 원소가 삽입된 후의 결과가 계산되지 않아
for문 밖에서 한 번 더 계산하는 과정을 추가했다.
import sys
arr = [ int(sys.stdin.readline()) for _ in range(int(sys.stdin.readline())) ]
stack = []
ans = [0]*len(arr)
for i in range(len(arr)):
while stack and stack[-1][0] <= arr[i]:
stack.pop()
stack.append((arr[i],i))
#print(stack)
for s in stack[:-1]:
ans[s[1]] = stack[-1][1] - s[1]
print(sum(ans))
728x90
반응형
'Algorithm Problems' 카테고리의 다른 글
[백준] [Python] 13305번 주유소 - Greedy (0) | 2021.06.01 |
---|---|
[백준] [Python] 11399번 ATM - Greedy - [대표예제] (0) | 2021.06.01 |
[백준] [Python] 1158번 요세푸스 문제 - 큐 (0) | 2021.05.30 |
[백준] [Python] 5430번 AC - 스택 (0) | 2021.05.29 |
[백준] [Python] 11047번 동전0 - Greedy (0) | 2021.05.25 |