본문 바로가기

IT/Python

[백준] 10828번 스택 [Python]

728x90

스택$($Stack$)$은 데이터를 저장하고 관리하는 자료구조 중 하나로, 후입선출$($Last In, First Out, LIFO$)$ 방식으로 동작합니다. 파이썬에서 스택은 리스트$($list$)$를 활용하여 구현할 수 있으며, 다양한 상황에서 유용하게 사용됩니다. 

  1. 함수 호출 스택
    재귀 함수를 사용할 때 스택은 함수 호출의 형태로 사용됩니다. 재귀 함수는 자기 자신을 호출하는 방식으로 동작하기 때문에 스택을 이용하여 함수 호출 순서를 관리합니다. 재귀적으로 호출되는 함수는 스택에 쌓이고, 함수가 반환되면 스택에서 제거됩니다.
  2. 브라우저 뒤로/앞으로 기능
    웹 브라우저에서 뒤로 가기, 앞으로 가기 기능은 스택을 사용하여 구현될 수 있습니다. 방문한 페이지의 URL을 스택에 추가하고, 뒤로 가기 버튼을 클릭하면 스택에서 해당 URL을 꺼내어 이동하게 됩니다. 앞으로 가기 기능도 마찬가지로 스택을 활용하여 구현할 수 있습니다.
  3. 후위 표기법 계산
    후위 표기법은 연산자를 피연산자 뒤에 쓰는 방식으로 수식을 표현하는 방법입니다. 스택을 사용하여 후위 표기법을 계산할 수 있습니다. 연산자를 만나면 스택에서 두 개의 피연산자를 꺼내어 연산하고, 결과를 다시 스택에 넣는 방식으로 계산합니다.
    더보기
    중위 표기법: 3 + 4 * 5
    후위 표기법: 3 4 5 * +

    중위 표기법: $($7 + 3$)$ * 5 - 2
    후위 표기법: 7 3 + 5 * 2 -

    중위 표기법: $($2 + 3$)$ * $($4 - 1$)$
    후위 표기법: 2 3 + 4 1 - *

    중위 표기법: 8 / $($4 + 2$)$ - 1
    후위 표기법: 8 4 2 + / 1 -
  4. 웹 서버 요청 처리
    웹 서버에서 클라이언트의 요청을 처리할 때 스택을 활용하는 경우가 있습니다. 클라이언트의 요청이 도착하면 스택에 해당 요청을 추가하고, 요청을 처리하는 과정에서 다른 서비스나 데이터베이스에 요청을 보내야 할 경우에도 스택을 사용하여 요청을 관리합니다. 요청 처리가 끝나면 스택에서 해당 요청을 제거합니다.

더보기

문제

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

명령은 총 다섯 가지이다.

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

입력

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

출력

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

 

import sys
input = sys.stdin.readline

N = int(input())
op = [0] * N
for i in range(N):
    op[i] = list(map(str, input().split()))

class Stack:
    stack = []

    def push(self, n):	# 스택 위에 n 추가
        self.n = n
        Stack.stack.append(self.n)

    def pop(self):	# 스택 맨 위의 값을 제거하면서 출력, 스택이 비었으면 -1 출력
        if Stack.stack == []:
            print(-1)
        else :
            print(Stack.stack.pop())
    
    def size(self):	# 스택의 갯수 출력
        print(len(Stack.stack))

    def empty(self):	# 스택이 비었으면 1, 아니면 0 출력
        if len(Stack.stack) != 0:
            print(0)
        else:
            print(1)
    
    def top(self):	# 스택 맨 위의 값 출력, 스택이 비었으면 -1 출력
        if len(Stack.stack) == 0:
            print(-1)
        else:
            print(Stack.stack[-1])

for i in range(N):
    if len(op[i]) == 2:	# push는 명령과 정수가 주어짐
        getattr(Stack(), op[i][0])(int(op[i][1]))
    else:
        getattr(Stack(), op[i][0])()

getattr$()$

 

더보기

'getattr' 함수는 파이썬 내장 함수 중 하나로, 객체의 속성$($attribute$)$을 동적으로 가져오는 함수입니다. 'getattr$($object, name, default$)$` 형태로 사용됩니다. 여기서 'object'는 해당 속성을 갖고 있는 객체를 의미하고, 'name'은 가져오려는 속성의 이름을 나타냅니다. 만약 해당 객체가 지정된 속성을 가지고 있지 않으면 'default' 값이 반환됩니다. 'default' 인자는 선택적이며, 생략할 수 있습니다.

'getattr' 함수는 주로 동적인 속성 접근이 필요한 상황에서 사용됩니다. 객체의 속성이 런타임에 결정되거나, 사용자로부터 입력으로 받은 속성을 조회해야 할 때 유용합니다.

예를 들어, 다음과 같은 클래스가 있다고 가정해봅시다:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

 

이제 'getattr' 함수를 사용하여 객체의 속성을 동적으로 조회할 수 있습니다:

person = Person("Alice", 30)

# 동적으로 속성 조회
name = getattr(person, "name")
print(name)  # 출력: "Alice"

# 존재하지 않는 속성 조회
gender = getattr(person, "gender", "Unknown")
print(gender)  # 출력: "Unknown"


위 코드에서 'getattr$($person, "name"$)$'은 'person' 객체의 'name' 속성을 가져오고, 'getattr$($person, "gender", "Unknown"$)$'은 'person' 객체에 'gender' 속성이 없을 경우 "Unknown"을 반환합니다.

'getattr' 함수를 사용하면 프로그램의 유연성을 높일 수 있고, 코드를 보다 동적으로 처리할 수 있습니다. 하지만 주의해야 할 점은 존재하지 않는 속성을 가져오려고 할 때 'default' 값을 지정해줘야 하며, 그렇지 않으면 'AttributeError' 예외가 발생할 수 있습니다.

 

더보기

예제 입력 1 

14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top

예제 출력 1 

2 2 0 2 1 -1 0 1 -1 0 3

 

예제 입력 2 

7
pop
top
push 123
top
pop
top
pop

예제 출력 2 

-1
-1
123
123
-1
-1

'IT > Python' 카테고리의 다른 글

[백준] 10845번 큐 [Python]  (0) 2023.08.01
[백준] 10866번 덱 [Python]  (0) 2023.08.01
[백준] 2839번 설탕 배달 [Python]  (0) 2023.07.31
[백준] 1018번 체스판 다시 칠하기 [Python]  (0) 2023.07.31