10828: 스택 - Python

beaver.zip·2024년 5월 23일
0

[알고리즘] 백준

목록 보기
4/45
post-thumbnail

문제

https://www.acmicpc.net/problem/10828

풀이 1 (정답)


import sys
input = sys.stdin.readline

def isEmpty(): # stack이 비어있는지 확인하는 함수
    global stack, top
    if top == -1:
        return True
    return False

n = int(input())
stack = [None] * n # stack 초기화
top = -1 # stack의 맨 위값의 index를 가리킴

for _ in range(n):
    s = input().strip() # readline은 개행문자를 포함하므로, 개행문자 제거
    if s[:4] == 'push':
        top += 1
        stack[top] = int(s[5:])
    elif s == 'pop':
        if isEmpty():
            print(-1)
        else:
            data = stack[top]
            stack[top] = None
            top -= 1
            print(data)
    elif s == 'size':
        if isEmpty():
            print(0)
        else:
            print(top+1)
    elif s == 'empty':
        if isEmpty():
            print(1)
        else:
            print(0)
    else:
        if isEmpty():
            print(-1)
        else:
            print(stack[top])

자료구조 수업 때 배운 대로 풀었다.
쉬운데 좀 길다.

풀이 2 (정답)

import sys
input = sys.stdin.readline

n = int(input())
stack = [None] * n
top = -1

for _ in range(n):
    s = input().strip()
    if s[:4] == 'push':
        top += 1
        stack[top] = int(s[5:])
    elif s == 'pop':
        if top == -1:
            print(-1)
        else:
            data = stack[top]
            stack[top] = None
            top -= 1
            print(data)
    elif s == 'size':
        if top == -1:
            print(0)
        else:
            print(top + 1)
    elif s == 'empty':
        if top == -1:
            print(1)
        else:
            print(0)
    else:
        if top == -1:
            print(-1)
        else:
            print(stack[top])

풀이 1isEmpty() 함수를 제거하고 top == -1로 대체하였다.
여전히 길다. .

풀이 3 (참고)

import sys
input = sys.stdin.readline

stack = []
for _ in range(int(input())):
    s = input().strip()
    if s[:4] == 'push':
        stack.append(int(s[5:]))
    elif s == 'pop':
        if len(stack) == 0: print(-1)
        else: print(stack.pop())
    elif s == 'size':
        print(len(stack))
    elif s == 'empty':
        if len(stack) == 0: print(1)
        else: print(0)
    else:
        if len(stack) == 0: print(-1)
        else: print(stack[-1])

stack을 초기화하지 않고 append()를 사용해 push를 하였다.
또한 pop() 함수를 사용해 코드가 간결해졌다.

풀이 2와 속도 차이가 꽤 날 거라고 생각했는데, 그다지 많이 차이 나지 않았다.


오늘의 교훈

profile
NLP 일짱이 되겠다.

0개의 댓글