isPowerfulBlog
[re-Solved] BOJ: 10828 | 스택 본문
2년 전 코드
import sys
input = sys.stdin.readline
N = int(input())
s = []
def command(com_list, stack):
# push
if len(com_list) > 1:
if com_list[0] == 'push':
stack.append(int(com_list[1]))
# top, size, empty, pop
else:
if com_list[0] == 'pop':
if stack:
print(stack.pop())
else:
print(-1)
elif com_list[0] == 'size':
print(len(stack))
elif com_list[0] == 'empty':
if stack:
print(0)
else:
print(1)
elif com_list[0] == 'top':
if stack:
print(stack[-1])
else:
print(-1)
return stack
for i in range(N):
com = list(input().split())
s = command(com, s)
- (good) 단순 스택 구현인 문제라 list도 괜찮은 선택
- (bad) 가독성 구림, 객체지향 아님
개선 코드
import sys
from collections import deque
input = sys.stdin.readline
class CustomStack:
def __init__(self):
self.stack = deque([])
def push(self, item):
self.stack.append(item)
def pop(self):
if self.stack:
return self.stack.pop()
else:
return -1
def size(self):
return len(self.stack)
def empty(self):
if self.stack:
return 0
else:
return 1
def top(self):
if self.stack:
return self.stack[-1]
else:
return -1
def operate(self, opr, item=None):
operators = {
'push': self.push,
'pop': self.pop,
'size': self.size,
'empty': self.empty,
'top': self.top,
}
if item:
operators[opr](item)
else:
sys.stdout.write(str(operators[opr]()) + "\n")
if __name__ == '__main__':
n = int(input())
custom_stack = CustomStack()
for _ in range(n):
inputs = input().split()
if len(inputs) > 1:
custom_stack.operate(inputs[0], inputs[1])
else:
custom_stack.operate(inputs[0])
- (good) 코드 가독성 좋아짐
배운점 / 다시 상기한 점
- 파이썬 리스트는 내부적으로 동적 배열 사용
- 그래서 후입선출(LIFO, append-pop)만 쓴다면 stack과 동일하게 동작 가능함
- 하지만 리스트는 더 범용적으로 사용 가능한 자료 구조임 (!= stack)
'Algorithm' 카테고리의 다른 글
[re-Solved] BOJ: 10773 | 제로 (0) | 2024.12.11 |
---|---|
[Solved] BOJ: 1920 | 수 찾기 (0) | 2024.12.11 |
[re-Solved] BOJ: 9012 | 괄호 (0) | 2024.12.10 |
[re-Solved] BOJ: 10845 | 큐 (0) | 2024.12.10 |
[Solved] BOJ: 2457 | 공주님의 정원 (2) | 2023.12.22 |