[백준] 10828번: 스택 [python]

Boknami·2022년 7월 13일
0

백준문제풀이

목록 보기
21/45

📑문제

자료구조 스택을 구현하자.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

💡 핵심

포인터 없이 스택 구현

1학년때부터 파이썬보다는 C언어를 사용하여 코딩을 해왔고, 3학년 이전까지는 알고리즘 문제 같은 것도 모두 C언어를 이용하여 풀었다. 하지만 문제 풀이 시간이나 용이성이 python이 더 뛰어나다 생각이 되어 최근에는 파이썬으로 문제를 풀이중이다. 이때까지 스택은 구조체, 포인터를 이용하여 연결리스트 스택을 만들어 사용해왔는데 포인터 없이 스택을 어떻게 구현할지가 첫 고민이었다.
그리 오래 고민하지 않고 배열을 사용하기로 하였다. 파이썬 배열은 append, pop을 통해 쉽게 접근, 생성, 삭제를 진행할 수 있기 때문에 어렵지 않게 해결할 수 있다 생각하였다.


❗ 어려웠던, 곤란했던

1) 쓸데없는 Count 변수 사용

이전 습관 때문에 스택에 현재 어느 정도 찼는지 Count 변수를 이용하여 표현하려 했다. 이것 때문에 코드가 더 지저분해지고 성능이 떨어진다 생각이 되어 삭제하였다.

2) 시간 초과

코딩한 것과 별개로 계속 시간 초과가 발생하였는데, for문은 한 개 뿐이고 따로 시간 초과되는 부분이 없어서 찾아보니

import sys
input=sys.stdin.readline

부분을 추가해주니 바로 해결되었다.
input보다 readline이 훨씬 성능이 좋은 것을 알게 되었다.


🧾 전체 코드

import sys
input=sys.stdin.readline

Stack = []

def push(k):
    Stack.append(k)

def pop():
    if(len(Stack) == 0):
        print('-1')
    else:
        popping = Stack.pop()
        print(popping)

def size():
    print(len(Stack))

def empty():
    if(len(Stack) == 0):
        print('1')
    else:
        print('0')

def top():
    if(len(Stack) == 0):
        print('-1')
    else:
        print(Stack[-1])
    
#명령어 개수
N = int(input())

#명령어 입력 받고 처리
for i in range(0, N):
    command = input()

    if("push" in command):
        a, b = command.split()
        push(int(b))

    elif("pop" in command):
        pop()
    
    elif("size" in command):
        size()

    elif("empty" in command):
        empty()

    elif("top" in command):
        top()

0개의 댓글