[Python] 백준 알고리즘 온라인 저지 10828 스택
https://www.acmicpc.net/problem/10828
스택의 개념을 이용하여 풀이하는 문제로 5가지 명령을 이용해 자료를 컨트롤하는 방법에 대한 알고리즘이다.
시간제한이 짧은 문제로 sys모듈을 사용하였고 이를 이용하다 문제점을 발견하여 수정하였다.
코드
import sys
input = sys.stdin.readline
# 5가지 명령
def push(x):
stack.append(x)
def pop():
if len(stack) == 0:
print(-1)
else:
last = stack[-1]
stack.pop()
print(last)
def size():
print(len(stack))
def empty():
if len(stack) == 0:
print(1)
else:
print(0)
def top():
if len(stack) == 0:
print(-1)
else:
print(stack[-1])
# 명령을 입력대로 실행하는 코드
n = int(input())
stack = []
for _ in range(n):
A = str(input().strip()) # sys모듈을 이용하면 마지막에 "\n"까지 문자열로 저장함
if A.find("push") == 0:
A, B = map(str, A.split())
if A == "push":
push(int(B))
else:
if A == 'pop':
pop()
elif A == "size":
size()
elif A == "empty":
empty()
elif A == "top":
top()
스택
스택은 기본 데이터 구조 중 하나로 후입 선출(LIFOLIFO : Last In, First Out)형 데이터 구조이다. 쉽게 풀이하여 설명하자면 식당의 접시와 같이 새로운 접시들이 오면 먼저 있던 접시 위에 쌓이게 되고 우리는 가장 위의 접시를 가져간다. (가끔 두 번째 접시를 꺼내기도 하지만 이런 경우는 제외하자)
즉 데이터들을 접시처럼 쌓아 놓고 맨 위에 데이터를 추가 혹은 제거하는 방식이다.
풀이
시간제한이 짧아 보여 sys 모듈과 함수를 이용하는 방법을 사용했다. 코드에는 두 가지 파트로 문제를 풀이했다.
명령 코드부터 정리하자면
- push - append를 사용하여 입력받은 수를 stack 리스트에 추가한다.
- pop - if문을 이용하여 stack 리스트가 비어있다면 -1을 출력, 정수가 있다면 내장 함수 pop을 이용하여 마지막 수를 빼고 그 수를 출력한다.
- size - 내장 함수 len을 이용하여 stack의 길이를 출력한다.
- empty - if문을 이용하여 stack이 비어있다면 1을 출력 아니라면 0을 출력한다.
- top - 제일 위의 수를 출력하는 명령으로 stack이 비어있다면 -1을 출력하고 아니라면 stack[-1]을 이용하여 마지막 요소를 출력한다.
각 명령을 함수로 정리하고 n번 명령을 받을 for문을 작성한다. 명령을 A로 받아 if문을 이용하여 구분하려 했는데 코드가 제대로 동작하지 않았다. 따로 출력해봤더니 sys모듈을 이용하여 str으로 입력을 받으면 뒤에 \n이 붙어있었다. 구글링을 통해 strip 내장 함수를 사용하면 \n을 제외하고 값을 받을 수 있다고 하여 사용하였고 성공적이었다.
push를 제외한 다른 명령들은 문자열만을 입력 값으로 이용한다 하지만 push는 뒤의 정수를 이용해야 하므로 find를 이용하여 push일 경우 A와 B를 따로 선언하여 B를 int값으로 바꿔준 뒤 push 함수를 사용하였다.
함수를 이용하는 방법은 코드는 조금 길지만 시간은 확실히 단축할 수 있는 것 같다.
풀이 결과
'알고리즘' 카테고리의 다른 글
백준 1463번 1로 만들기 파이썬 풀이 (0) | 2022.02.05 |
---|---|
백준 9093번 단어 뒤집기 파이썬 풀이 (0) | 2022.02.03 |
백준 18870번 좌표 압축 파이썬 풀이 (0) | 2022.01.30 |
백준 10814번 나이순 정렬 파이썬 풀이 (0) | 2022.01.27 |
백준 1181번 단어 정렬 파이썬 풀이 (0) | 2022.01.26 |