스택$($Stack$)$은 데이터를 저장하고 관리하는 자료구조 중 하나로, 후입선출$($Last In, First Out, LIFO$)$ 방식으로 동작합니다. 파이썬에서 스택은 리스트$($list$)$를 활용하여 구현할 수 있으며, 다양한 상황에서 유용하게 사용됩니다.
- 함수 호출 스택
재귀 함수를 사용할 때 스택은 함수 호출의 형태로 사용됩니다. 재귀 함수는 자기 자신을 호출하는 방식으로 동작하기 때문에 스택을 이용하여 함수 호출 순서를 관리합니다. 재귀적으로 호출되는 함수는 스택에 쌓이고, 함수가 반환되면 스택에서 제거됩니다. - 브라우저 뒤로/앞으로 기능
웹 브라우저에서 뒤로 가기, 앞으로 가기 기능은 스택을 사용하여 구현될 수 있습니다. 방문한 페이지의 URL을 스택에 추가하고, 뒤로 가기 버튼을 클릭하면 스택에서 해당 URL을 꺼내어 이동하게 됩니다. 앞으로 가기 기능도 마찬가지로 스택을 활용하여 구현할 수 있습니다. - 후위 표기법 계산
후위 표기법은 연산자를 피연산자 뒤에 쓰는 방식으로 수식을 표현하는 방법입니다. 스택을 사용하여 후위 표기법을 계산할 수 있습니다. 연산자를 만나면 스택에서 두 개의 피연산자를 꺼내어 연산하고, 결과를 다시 스택에 넣는 방식으로 계산합니다.더보기중위 표기법: 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 - - 웹 서버 요청 처리
웹 서버에서 클라이언트의 요청을 처리할 때 스택을 활용하는 경우가 있습니다. 클라이언트의 요청이 도착하면 스택에 해당 요청을 추가하고, 요청을 처리하는 과정에서 다른 서비스나 데이터베이스에 요청을 보내야 할 경우에도 스택을 사용하여 요청을 관리합니다. 요청 처리가 끝나면 스택에서 해당 요청을 제거합니다.
문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- 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 |