1. 정의
1) 뜻 : 스택(stack)은 데이터를 임시 저장하는 기본 자료구조
2) 입출력 순서 : 후입 선출
- 쉽게말해 데이터를 넣을때(push) 마지막 데이터에 들어가며, 빼면(pop) 마지막 데이터가 나온다.
2. 기본 용어
1) Push
- 스택에서 데이터를 넣을때 사용하는 용어
- 마지막에 데이터가 추가되는 것을 볼 수 있다.
2)Pop
- 스택에서 데이터를 가져올때 사용하는 용어
- 마지막의 데이터를 가져오게 된다.
3) Stk
- push한 데이터를 저장하는 스택본체의 list형 배열 이다.
4) Stk의 bottom, top
- 말그대로 Stk의 가장 밑이 bottom, 스택에 들어있는 데이터의 가장 마지막 데이터를 top이라고 한다.
- 주의해야 할 것은 데이터가 가장 처음 쌓이는 곳은 stk[0]이다.
5) Capacity(스택의 크기)
- 스택에 쌓을 수 있는 크기를 말한다.
6) *Ptr(스택포인터)
- 현재 스택에 쌓여 있는 데이터의 개수를 나타내는 정수값이다.
- 스택이 push되면 이 prt에 쌓이게 된다.
3. 예시 문제(백준,9012, 괄호)
1) 문제
2) 문제 해석
- 직관적으론 문제에서 말하는 올바른 괄호(VPS)가 맞는지 틀린지 찾는 문제이다.
- 스택을 연관하여 발견해야 할 부분은 주어진 문자(괄호)를 하나씩 받아 만든 스택에 넣을지, 말지, 기존껄 pop할지 판단해야 한다.
3) 코드 방향성
- 케이스를 받는다.
- 케이스의 숫자만큼 받은 괄호가 담긴 문자열을 반복문을 통해 괄호 하나씩 확인한다.
- stack이란 리스트에 push, pop을 반복하며 리스트가 비어있다면(len(stack)==0) 'YES'를 찍어주고, 그렇지 않다면 'NO'를 찍어 줄꺼다.
- 이부분까지만 이해 하면서 코드를 보자
4) 코드
import sys
# 09. https://www.acmicpc.net/problem/9012 : 괄호
input = sys.stdin.readline
for _ in range(int(input())): # 첫 줄의 케이스를 받고 그 range만큼 괄호를 받는다.
s = input() # 괄호를 받는다
stack = [] # 스택으로 쌓을 빈 리스트
for c in s: # 괄호 문자열에서 하나씩 확인
if c == '(': # 열린 괄호면 스택에 추가
stack.append(c) # 나중에 ')'가 들어올때 빼낼 꺼다.
elif c == ')': # 닫힌 괄호이면서
if len(stack)==0 or stack[-1] != '(':# 리스트가 없거나 스택의 마지막이 ')'이면
stack.append(')') # 스택에 추가 하고
break # 반복문 나가
stack.pop() # 스택에 ( 열린괄호가 있으면 pop
# 스택에 리스트가 짝으로 있다면 YES출력, 없거나 하나면 NO출력
if len(stack) == 0:
print('YES')
else:
print('NO')
- 다른 블로그를 참조하였으며, 나에게 많이 어려운 코드다.
- 하지만 스택의 정의를 잘 살린것 같고 생각의 전환이 많이 들어같다는 개인적인 생각으로 도전해 봤다.
'Develop > Algorithm' 카테고리의 다른 글
[큐]queue 정리_1(백준_11866_요세푸스 문제 0) (0) | 2022.10.04 |
---|---|
[문제풀이]백준_2504_괄호의 값(스택_2, enumerate함수) (0) | 2022.10.04 |
[탐색알고리즘]이분탐색 (0) | 2022.10.01 |
[문제풀이]백준 2805 나무자르기 (0) | 2022.10.01 |
[문제풀이]백준 1920 수찾기 (0) | 2022.10.01 |