본문 바로가기

알고리즘 삽질장

[BOJ] 17298번 - 오큰수

반응형


문제설명

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

사고과정

  • 처음에 이중 for 문으로 구현하려 했다가 바로 시간초과가 발생하는 것을 인지했다.. 그래서 어떻게든 자료구조 스택이나 큐를 활용해서 해결해야 할 것 같은데.. 큐를 활용해보려고 했으나 큐도 어쨌거나 한 번의 선형 루프를 또 활용하는 아이디어 밖에 떠오르지 않았다.. 스택은 어떻게 활용할지 감이 오지 않았다
  • 풀이를 보니 스택을 활용했는데, n개의 수열 하나씩 도는데, 안에다가 while 문과 스택을 활용해서 해결했다.
  • answer이라는 각 수열의 인덱스에 해당하는 오큰수 값으로 하고 -1로 해서 초기화시켰다(-1로 초기화시켜서 오큰수가 없는 수는 자동으로 -1을 출력할 수 있도록 했음)
  • 스택에는 원소값이 아닌 수열의 인덱스를 넣어준다. 그리고 수열의 가장 첫번째 인덱스를 스택에 넣고 시작한다. 그리고 수열의 인덱스를 1부터 n-1까지 돌면서 현재 수열의 값 >  스택의 마지막 인덱스가 가리키는 수열의 값 이게 되면 오큰수에 해당하는 조건이므로 answer 리스트에 업데이트 해준다. 단, 가장 왼쪽에 있는 값을 가져와야 하므로 while문으로 스택에 가장 앞에 있는 원소까지 반복할 수 있도록 했다..
  • 간단한 문제인 줄 알았는데 스택을 매우 잘 활용해야 하는 문제인 듯 하다..

풀이(스스로 못 푼 풀이)

import sys

input = sys.stdin.readline
n = int(input().rstrip())
array = list(map(int, input().split()))
answer = [-1] * n
stack = []
stack.append(0)

for i in range(1, n):
    # 스택의 FILO 순서로 하나씩 빼면서 대소비교 -> 스택의 왼쪽으로 가면서 '가장 왼쪽에 있는 수'를 탐색!
    while stack and array[i] > array[stack[-1]]:
        answer[stack.pop()] = array[i]
    stack.append(i)

print(*answer)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[BOJ] 1918번 - 후위 표기식  (0) 2021.10.25
[BOJ] 17299번 - 오등큰수  (0) 2021.10.25
[BOJ] 10799번 - 쇠막대기  (0) 2021.10.25
[BOJ] 17413번 - 단어 뒤집기 2  (0) 2021.10.24
[BOJ] 1158번 - 요세푸스 문제  (0) 2021.10.24