[Python] 백준 28278번 스택 2(실버4)
문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- 1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000)
- 2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다.
- 3: 스택에 들어있는 정수의 개수를 출력한다.
- 4: 스택이 비어있으면 1, 아니면 0을 출력한다.
- 5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다.
입력
첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000)
둘째 줄부터 N개 줄에 명령이 하나씩 주어진다.
출력을 요구하는 명령은 하나 이상 주어진다.
출력
출력을 요구하는 명령이 주어질 때마다 명령의 결과를 한 줄에 하나씩 출력한다.
예제 입력 1
9
4
1 3
1 5
3
2
5
2
2
5
예제 출력 1
1
2
5
3
3
-1
-1
풀이
숫자를 List에 저장하고, Stack 처럼 이용해 봅시다.
Point
- List
- Stack
소스코드
import sys
def input():
return sys.stdin.readline().strip()
stack = []
for _ in range(int(input())):
k = input()
if len(k) != 1:
_ , x = map(int,k.split())
stack.append(x)
else:
if k == '2':
if len(stack) == 0:
print(-1)
else:
print(stack.pop())
elif k == '3':
print(len(stack))
elif k == '4':
print(int(len(stack) == 0))
elif k == '5':
if len(stack) == 0:
print(-1)
else:
print(stack[-1])
stack이라는 list를 만들고 이를 stack으로 활용합니다.
stack은 'First in Last out' 규칙을 따르기 때문에,
stack에서 항목을 뺄 때, 맨 마지막에 집어 넣은 항목을 빼냅니다.
Line 1~3
import sys
def input():
return sys.stdin.readline().strip()
많은 문자열을 짧은 시간내로 받기 위해 input()함수를 sys.stdin.readline().strip()으로 대체합니다.
Line 5~26
stack = []
for _ in range(int(input())):
k = input()
if len(k) != 1:
_ , x = map(int,k.split())
stack.append(x)
else:
if k == '2':
if len(stack) == 0:
print(-1)
else:
print(stack.pop())
elif k == '3':
print(len(stack))
elif k == '4':
print(int(len(stack) == 0))
elif k == '5':
if len(stack) == 0:
print(-1)
else:
print(stack[-1])
input에 따라 경우를 나누어 줍니다.
input (= k) 에 들어오는 정수의 갯수가 2개인 경우부터 구분하기 위해,
1.
k의 길이가 1이 아니라면, (문제 상황의 1번 상황 : k = '1 X' )
k를 둘로 나누어 두번째 x 값을 stack에 추가해 줍니다.
2.
k 가 '2'라면, stack이 비어있으면 -1 을 출력, 아니라면 stack의 마지막 항목을 pop하고(뽑아내고) 출력합니다.
3.
k 가 '3'이라면, stack의 길이를 출력합니다.
4.
k 가 '4'라면, stack의 길이가 0인지 아닌지 (True / False) 를 정수로 변환해 ( 1 / 0 ) 을 출력합니다.
5.
k 가 '5'라면, stack이 비어있으면 -1 을 출력, 아니라면 stack의 마지막 항목을 stack[-1]을 출력합니다.