코딩 테스트/Python

[백준 코딩테스트(Python)] - 10828번 스택

알밤바 2022. 11. 23. 09:29
728x90
반응형

 

10828번: 스택

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

www.acmicpc.net

 

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

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

 

입력

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

 

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

 


풀이 방향

🔍 스택(stack)이란?

데이터의 삽입과 삭제가 데이터의 한쪽 끝에서만 일어나는 자료구조임

마지막에 들어간 데이터가 가장 먼저 나오는 후입선출(Last IN, First OUT)

 

프링글스 과자처럼 가장 마지막에 담긴 감자칩이 가장 먼저 나오는 구조라고 생각하면 됨

 

📌 파이썬에서는 stack 라이브러리를 지원하지 않는다. 그래서 보통 deque 라이브러리를 사용한다.

from collections import deque

dq = deque()

# 데이터 넣기 (덱의 가장 오른쪽에 원소 삽입)
dq.append(0)
dq.append('abc')

# 덱의 가장 왼쪽에 원소 삽입
dq.appendleft('def')   # deque(['def', 0, 'abc'])

# 덱의 가장 왼쪽 원소 반환
dq.popleft()    # deque([0, 'abc'])

# 덱의 가장 오른쪽 원소 반환
dq.pop()    # deque([0])

# 모든 원소 제거
dq.clear()   # deque([])

 

 

파이썬 collections deque 함수 (덱,데크) 사용법

https://docs.python.org/3/library/collections.html#collections.deque collections — Container datatypes — Python 3.8.5 documentation collections — Container datatypes Source code: Lib/collections/__init__.py This module implements specialized containe

j-ungry.tistory.com

 

 

[Python 자료구조] 스택(Stack)

스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있도록 제한된 선형으로 나열된 자료구조이다. 쉽게 비유하자면 비어있는 '프링글스 통'을 생각해보자.

velog.io

 

 

[+] Queue 라이브러리의 LifoQueue()를 활용해도 좋을 듯!

LifoQueue() : 나중에 입력된 데이터가 먼저 출력되는 자료구조 (stack과 유사 / Last IN First OUT)

import queue

queue = queue.LifoQueue()

# 데이터 넣기
queue.put(0)
queue.put('abc')

# 큐에 있는 데이터 갯수
queue.qsize()    # 2

# 데이터 제거
queue.get()  # 가장 먼저 삽입된 데이터(abc)가 제거됨

 

 

[백준 코딩테스트(Python)] - 10845번 큐

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

ars420.tistory.com

 

 

풀이 코드

import sys

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

stack = []

for _ in range(N):
    order = sys.stdin.readline().split()

    if order[0] == 'push':
        stack.append(order[1])
    
    elif order[0] == 'pop':
        if len(stack) != 0:
            print(stack.pop()) # pop에서 인덱스를 생략한 경우에는 마지막 값을 취득하고 삭제
        else:
            print(-1)
    
    elif order[0] == 'size':
        print(len(stack))
    
    elif order[0] == 'empty':
        if len(stack) == 0:
            print(1)
        else:
            print(0)
    
    elif order[0] == 'top':
        if len(stack) != 0:
            print(stack[-1])
        else:
            print(-1)

 

✅ 처음엔 런타임에러가 나서 뭐가 잘못되었는지 찾아보았다. pop 부분에서 아래와 같이 코드를 짠 것이 문제였다.

    elif order[0] == 'pop':
        if len(stack) != 0:
            print(stack[-1])
            stack.remove(stack[-1])
        else:
            print(-1)

▼▼▼

    elif order[0] == 'pop':
        if len(stack) != 0:
            print(stack.pop())
        else:
            print(-1)

 

출력하고, remove로 원소를 제거하는 것이 아니라, 한번에 pop() 함수를 사용하면 된다.

⭐ pop()에서 인덱스를 생략한 경우에는 마지막 값을 출력하고 삭제한다. ⭐ 

 

 

728x90
반응형