isPowerfulBlog

[re-Solved] BOJ: 10828 | 스택 본문

Algorithm

[re-Solved] BOJ: 10828 | 스택

왕밤빵도라에몽 2024. 12. 10. 22:34

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