문제링크 : https://www.acmicpc.net/problem/17298
17298번: 오큰수
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
www.acmicpc.net
풀이과정:
처음에는 해당 인덱스 뒤로 포문을 돌려서 첫번째로 나오는 큰 수를 저장하고 break 하는식으로
풀었는데 시간과촤가 나왔다. 한 인덱스에 n번 연산이니 O(n**2)가 되므로 시간초과가 뜰만하다.
"""
#시간초과
import sys
lst_len = int(input())
lst = list(map(int, sys.stdin.readline().split()))
answer = []
for i in range(lst_len):
found = 0
if i == lst_len-1:
answer.append(str(-1))
break
for j in range(i+1, lst_len):
if lst[i] < lst[j]:
answer.append(str(lst[j]))
found = 1
break
if found==0:
answer.append(str(-1))
print(" ".join(answer))
"""
그렇가면 빅오의 시간을 줄이려면 어떻게 해야될까, 여기서 스택이 등장한다.
스택은 현재 기준이 되는 인덱스를 나타낸다.
가령 [3, 5, 2, 7]로 예를 들면, 차례대로 인덱스 0, 1, 2, 3 이다
인덱스 0을 stack에 넣고, 1번인덱스값(5)와 비교한다.
1번 인덱스가 더 크기 때문에 정답 리스트는 -1 -> 1번인덱스 값으로 갱신된다.
이번엔 1번 인덱스와 2번인덱스값(2)를 비교했을때 2번 인덱스값이 더 작으므로,
반복문에 들어가지않고, stack에 누적된다. 그리고 나서 3번인덱스와 1번 인덱스가 다시
비교되고, 3번인덱스가 더 크기때문에 이에 따라 2번인덱스도 3번인덱스로 갱신되고,
1번 인덱스도 3번 인덱스로 갱신된다.
이렇게 스택을 활용하여 알고리즘을 짜면 O(n)로 해결이된다.
import sys
lst_len = int(input())
lst = list(map(int, sys.stdin.readline().split()))
answer = [-1] * lst_len
stack = []
stack.append(0)
for i in range(1, lst_len):
while stack and lst[i] > lst[stack[-1]]:
answer[stack.pop()] = lst[i]
stack.append(i)
print(*answer)
후기: 자료구조를 복습하면서, 스택 큐에 대해 어느정도 알았다고 생각했는데,
막상 활용하려니 쉽지않다..
'Coding > 백준' 카테고리의 다른 글
[백준] 11727 - 2*n 타일링 2 (동적프로그래밍) - (python 파이썬) (0) | 2022.02.07 |
---|---|
[백준] 17298 - 오등큰수 - (python 파이썬) (0) | 2022.02.06 |
[백준] 10799 - 쇠막대기 - (python 파이썬) (0) | 2022.02.05 |
[백준] 1463 - 1로 만들기(동적프로그래밍) - (python 파이썬) (0) | 2022.02.04 |
[백준] 10866 - 덱 - (python 파이썬) (0) | 2022.02.04 |