본문 바로가기

🖥️ 오늘의 백준

백준 10828번 : 스택 [Python]

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

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

전체코드

import sys

class Stack():
    def __init__(self):
        self.stack = []

    def push(self, x):
        self.stack.append(x)
    
    def pop(self):
        if len(self.stack) == 0:
            return "-1"
        else:
            return self.stack.pop()
    
    def size(self):
        return len(self.stack)
    
    def empty(self):
        if len(self.stack) == 0:
            return True
        else:
            return False

    def top(self):
        if len(self.stack) == 0:
            return "-1"
        else:
            return self.stack[-1]

N = int(sys.stdin.readline())

stack = Stack()

for i in range(N):
    command = sys.stdin.readline().split()
    if command[0] == "push":
        stack.push(int(command[1]))
    elif command[0] == "pop":
        print(stack.pop())
    elif command[0] == "size":
        print(stack.size())
    elif command[0] == "empty":
        print(1 if stack.empty() else 0)
    elif command[0] == "top":
        print(stack.top())

 

풀이 설명

  • 각 명령어를 입력받고 실행하기 위해 클래스에 메소드를 만들었음
  • push 메소드의 경우 push X 명령어와 숫자(매개변수)를 같이 입력하기 때문에 split()로 입력을 받고 리스트를 활용한다. 
    • 다른 메소드의 경우는 값이 하나만 입력되기 때문에 [메소드, ] [1]의 값은 비어있는 상태이다. 
    • 그러므로 메소드를 구분하기 위한 문자열 비교는 [0]의 값과 진행하여야하고
    • push의 경우 [0]으로 메소드를, [1]로 매개변수의 값을 가져온다.
  • True, False 출력 => 삼항 연산자 활용
형식
조건이 참인 경우 값1 if 조건 else 값2


print(1 if stack.empty() else 0)  // empty이면(true이면) 1을, false이면 0을 출력한다.
  • 시간초과 문제 발생
input() 에서 시간초과가 일어날 수 있으므로 input()대신 sys.stdin.readline() 사용해줌

import sys
sys.stdin.readline()

 

스택은 배열, 리스트를 이용하여 구현할 수 있다.
스택 : 후입선출 (마지막에 들어온 것부터 나간다)

 

+ 큐는 c++에서는 queue를 제공하여주고, 파이썬에서는 리스트로 인덱싱하여 구현이 가능하다. (큐 : 선입선출)