스택과 큐는 리스트에서 조금 더 발전한 형태의 자료구조이다. 스택과 큐는 구조는 비슷하지만 처리 방식이 다르다.
[스택 핵심 이론]
[파이썬의 스택]
[큐 핵심 이론]
[파이썬의 스택]
[우선순위 큐]
시간 제한 2초, 실버 III, 백준 1874번
1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하라.
첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄부터 n개의 줄에는 수열을 이루는 1이상 n이하의 정수가 하나씩 순서대로 주어진다. 물론 같은 정수가 두 번 나오는 일은 없다.
8 # 수열의 개수 4 3 6 8 7 5 2 1
입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. push연산은 +로, pop 연산은 -로 표현하도록 한다. 불가능한 경우 NO를 출력한다.
+ + + + - - + + - + + - - - - -
현재 수열 값 >= 자연수
현재 수열 값 < 자연수
N(수열 개수) A(수열 리스트)
A 수열 리스트 채우기
for N만큼 반복:
if 현재 수열값 >= 오름차순 자연수:
while 현재 수열값 >= 오름차순 자연수:
append()
오름차순 자연수 1 증가
(+) 저장
pop()
(-) 저장
else 현재 수열값 < 오름차순 자연수:
pop()
if 스택 pop 결괏값 > 수열의 수:
NO 출력
else:
(-) 저장
if NO 값을 출력한 적이 없으면:
저장한 값 출력
N = int(input())
A = [0] * N
for i in range(N):
A[i] = int(input())
stack = []
num = 1
result = True
answer = ""
for i in range(N):
su = A[i]
if su >= num: # 현재 수열값 >= 오름차순 자연수: 값이 같아질 때까지 append() 수행
while su >= num:
stack.append(num)
num += 1
answer += "+\n"
stack.pop()
answer += "-\n"
else: # 현재 수열값 < 오름차순 자연수: pop()을 수행해 수열 원소를 꺼냄
n = stack.pop()
# 스택의 가장 위의 수가 만들어야 하는 수열의 수보다 크면 수열을 출력할 수 없음
if n > su:
print("NO")
result = False
break
else:
answer += "-\n"
if result:
print(answer)
시간 제한 1초, 골드 IV, 백준 17298번
크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다.
예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다.
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
4 3 5 2 7
총 N개의 수 NGE(1), NGE(2), ..., NGE(N)을 공백으로 구분해 출력한다.
5 7 7 -1
[핵심 아이디어]
N(수열 개수) A(수열 리스트) ans(정답 리스트)
A 수열 리스트 채우기
myStack(스택 선언)
for i를 N만큼 반복:
while 스택이 비지 않고, 현재 수열값이 top에 해당하는 수열보다 클 때까지:
스택에서 pop한 값을 index로 하는 정답 리스트 부분을 수열 리스트의 현재 값(A[i])으로 저장
스택에 i의 값을 저장
while 스택이 빌 때까지:
스택에 있는 index의 정답 리스트에 -1 저장
정답 리스트 출력
import sys
n = int(input())
ans = [0] * n
A = list(map(int, input().split()))
myStack = []
for i in range(n):
# 스택이 비어 있지 않고 현재 수열이 스택 top 인덱스가 가리키는 수열보다 클 경우
while myStack and A[myStack[-1]] < A[i]:
ans[myStack.pop()] = A[i] # 정답 배열에 오큰수를 현재 수열로 저장하기
myStack.append(i)
while myStack: # 반복문을 다 돌고 나왔는데 스택이 비어 있지 않다면 빌 때까지
ans[myStack.pop()] = -1 # 스택에 쌓인 index에 -1을 넣기
for i in range(n):
sys.stdout.write(str(ans[i]) + " ")