일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- html
- 백준
- 코드스테이츠
- useState
- 운영체제
- UX
- mysemester
- 프로토타입
- level1
- web
- 생활코딩
- UI
- React
- 30daysdowoonchallenge
- javascript
- 회고
- 해시테이블
- Next.js
- 카카오
- Til
- 스택
- CSS
- vercel
- 자료구조
- 프로그래머스
- 자바스크립트
- redux
- 큐
- REST_API
- superstarjypnation
- Today
- Total
데굴데굴
[파이썬] 10828번: 스택 본문
10828번: 스택
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
오늘 자료구조 강의에서 스택 공부한 김에 백준에서 스택 문제를 풀어보았다.
다른 경우는 명령어만 입력되는데 push는 명령어와 값이 같이 입력되는 형태라 input에서 어떻게 나눠줘야 할 지 고민이 많았다.
input().split()으로 하면 다른 명렁어 처리에서 오류가 발생하고, 리스트는 시간초과가 발생한다.
결국 구글링해보니 대부분이 시간초과 때문에 sys.stdin.readline()을 활용하고 있었다.
스택은 자료구조 강의에서 배웠던 것처럼 클래스로 구현한 후 반복문을 작성해주었다.
파이썬은 리스트를 통해 스택에서 수행할 수 있는 연산을 모두 할 수 있기 때문에 따로 스택을 제공하지는 않는다.
하지만 확실히 스택을 구현해놓으니 반복문을 짤 때 훨씬 편했다.
그래도 혹시 모르니 리스트로도 한 번 풀어봐야 할 것 같다.
스택 구현 및 스택 강의 정리글 링크는 여기
1. 스택 클래스 구현
# 정수 저장 Stack 구현
import sys
class Stack:
def __init__(self):
self.items = [] # 데이터 저장을 위한 리스트 준비
def push(self, val):
self.items.append(val) # 스택에 값 추가
def pop(self):
try:
print(self.items.pop()) # pop할 아이템이 없으면
except IndexError: # IndexError 발생
print(-1)
def size(self):
print(len(self.items)) # 리스트의 길이 출력
def top(self):
try:
print(self.items[-1]) # 맨 오른쪽 값 = top
except IndexError:
print(-1)
def empty(self):
if len(self.items) == 0:
print(1)
else:
print(0)
S = Stack()
n = int(sys.stdin.readline())
for i in range(n):
com = sys.stdin.readline().split()
if com[0] == 'top':
S.top()
elif com[0] == 'size':
S.size()
elif com[0] == 'empty':
S.empty()
elif com[0] == 'pop':
S.pop()
else:
S.push(com[1])
top과 pop에서 값이 출력되지 않아 의아했는데 자세히 보니 처음 스택 구현 코드에서 return으로 쓰여 있어서 그런 것이었다.
그냥 print로 바꿔주니 바로 해결됐음.
com = sys.stdin.readline().split() 에서 com의 자료형을 확인해보니 리스트였다.
따라서 com의 두 번째 원소를 인덱싱하여 S.push()에 넣어주었다.
2. 리스트로 풀기
(++ 06.30 update)
스택을 따로 구현하지 않고 리스트로 푼 코드이다.
예제는 다 맞는데도 자꾸 '틀렸습니다'가 떠서 의아했는데 n을 입력받을 때에도 sys.stdin.readline()을 써야하는 걸 알고 굉장히 허무했다.... n은 input()으로 입력받는게 너무 익숙해져서 문제를 알아차리지도 못했나보다.
import sys
n = int(sys.stdin.readline())
stack = []
for i in range(n):
lst = sys.stdin.readline().split()
if lst[0] == 'push':
stack.append(int(lst[1])) # 정수를 stack에 넣어야 하므로 int로 형변환
elif lst[0] == 'top':
if len(stack) == 0:
print(-1)
else:
print(stack[-1])
elif lst[0] == 'pop':
try:
print(stack.pop())
except IndexError:
print(-1)
elif lst[0] == 'size':
print(len(stack))
elif lst[0] == 'empty':
if len(stack) == 0:
print(1)
else:
print(0)
'algorithm > 백준' 카테고리의 다른 글
[파이썬] 10845번: 큐 (0) | 2022.06.30 |
---|---|
[파이썬] 9012번: 괄호 (0) | 2022.06.16 |
[파이썬] 10870번: 피보나치 수 5 (0) | 2022.06.14 |
[파이썬] 10872번: 팩토리얼 (0) | 2022.06.14 |
[파이썬] 9020번: 골드바흐의 추측 (0) | 2022.06.13 |