10828번: 스택
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
풀이 방향
🔍 스택(stack)이란?
데이터의 삽입과 삭제가 데이터의 한쪽 끝에서만 일어나는 자료구조임
마지막에 들어간 데이터가 가장 먼저 나오는 후입선출(Last IN, First OUT)임
프링글스 과자처럼 가장 마지막에 담긴 감자칩이 가장 먼저 나오는 구조라고 생각하면 됨
📌 파이썬에서는 stack 라이브러리를 지원하지 않는다. 그래서 보통 deque 라이브러리를 사용한다.
from collections import deque
dq = deque()
# 데이터 넣기 (덱의 가장 오른쪽에 원소 삽입)
dq.append(0)
dq.append('abc')
# 덱의 가장 왼쪽에 원소 삽입
dq.appendleft('def') # deque(['def', 0, 'abc'])
# 덱의 가장 왼쪽 원소 반환
dq.popleft() # deque([0, 'abc'])
# 덱의 가장 오른쪽 원소 반환
dq.pop() # deque([0])
# 모든 원소 제거
dq.clear() # deque([])
파이썬 collections deque 함수 (덱,데크) 사용법
https://docs.python.org/3/library/collections.html#collections.deque collections — Container datatypes — Python 3.8.5 documentation collections — Container datatypes Source code: Lib/collections/__init__.py This module implements specialized containe
j-ungry.tistory.com
[Python 자료구조] 스택(Stack)
스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있도록 제한된 선형으로 나열된 자료구조이다. 쉽게 비유하자면 비어있는 '프링글스 통'을 생각해보자.
velog.io
[+] Queue 라이브러리의 LifoQueue()를 활용해도 좋을 듯!
LifoQueue() : 나중에 입력된 데이터가 먼저 출력되는 자료구조 (stack과 유사 / Last IN First OUT)
import queue
queue = queue.LifoQueue()
# 데이터 넣기
queue.put(0)
queue.put('abc')
# 큐에 있는 데이터 갯수
queue.qsize() # 2
# 데이터 제거
queue.get() # 가장 먼저 삽입된 데이터(abc)가 제거됨
[백준 코딩테스트(Python)] - 10845번 큐
10845번: 큐 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에
ars420.tistory.com
풀이 코드
import sys
N = int(sys.stdin.readline())
stack = []
for _ in range(N):
order = sys.stdin.readline().split()
if order[0] == 'push':
stack.append(order[1])
elif order[0] == 'pop':
if len(stack) != 0:
print(stack.pop()) # pop에서 인덱스를 생략한 경우에는 마지막 값을 취득하고 삭제
else:
print(-1)
elif order[0] == 'size':
print(len(stack))
elif order[0] == 'empty':
if len(stack) == 0:
print(1)
else:
print(0)
elif order[0] == 'top':
if len(stack) != 0:
print(stack[-1])
else:
print(-1)
✅ 처음엔 런타임에러가 나서 뭐가 잘못되었는지 찾아보았다. pop 부분에서 아래와 같이 코드를 짠 것이 문제였다.
elif order[0] == 'pop':
if len(stack) != 0:
print(stack[-1])
stack.remove(stack[-1])
else:
print(-1)
▼▼▼
elif order[0] == 'pop':
if len(stack) != 0:
print(stack.pop())
else:
print(-1)
출력하고, remove로 원소를 제거하는 것이 아니라, 한번에 pop() 함수를 사용하면 된다.
⭐ pop()에서 인덱스를 생략한 경우에는 마지막 값을 출력하고 삭제한다. ⭐
'코딩 테스트 > Python' 카테고리의 다른 글
[백준 코딩테스트(Python)] - 108660번 덱 (1) | 2022.11.24 |
---|---|
[백준 코딩테스트(Python)] - 10845번 큐 (1) | 2022.11.22 |
[백준 코딩테스트(Python)] - 2609번 최대공약수와 최소공배수 (유클리드 호제법) (0) | 2022.11.15 |
[백준 코딩테스트(Python)] - 1259번 팰린드롬수 (0) | 2022.11.15 |
[백준 코딩테스트(Python)] 정렬 - 좌표 압축 (0) | 2022.10.26 |