BeakJoon/Python
[Python] 백준 #10828번 : 스택
쿼딩~
2023. 10. 15. 14:57
이 문제에서 고민했던 것
- not enough values to unpack 이 오류를 해결하기 위해서는 명령어와 정수를 각각 다른 함수에 입력받으면 안됨 → 정수 입력이 없는 명령어를 실행 할 때는 오류가 생김
- -> 이 문제는 cmd 라는 리스트로 명령어와 정수를 리스트로 저장하면 정수가 있을 때 없을 때 구분 없이 기능을 하게 되겠구나 깨달음
- 위 문제를 처음에는 다섯 개의 명령의 이름으로 각각 함수를 따로 정의하고 기능을 추가해서 할 생각이었음
- -> 하지만 너무 돌아가는 느낌이 있어 그냥 if문과 elif문을 사용하여 명령어를 문자열로 입력받아 조건으로 입력받은 문자열과 명령의 이름과 같으면 그 기능을 구사하게 만들기로 결정함
- -> but 알고리즘 스터디에서 def 등으로 각각 함수를 따로 정의하는 것이 코딩 할 때 도움이 많이 되는 방식이라고 피드백 받음
- -> 하지만 너무 돌아가는 느낌이 있어 그냥 if문과 elif문을 사용하여 명령어를 문자열로 입력받아 조건으로 입력받은 문자열과 명령의 이름과 같으면 그 기능을 구사하게 만들기로 결정함
코드
맨 처음 만든 코드
N = int(input())
stack = []
for _ in range(N):
cmd, x = input().split()
if cmd == 'push':
stack.append(x)
elif cmd == 'pop':
if not stack:
print ('-1')
else:
stack.pop()
elif cmd == 'size':
print(len(stack))
elif cmd == 'empty':
if not stack:
print ('1')
else:
print ('0')
elif cmd == 'top':
if not stack:
print (-1)
else:
print (stack.data[-1])
위의 코드를 컴파일 해보니 top 명령어를 쓸 때 “not enough values to unpack” 오류가 발생함
- 오류가 발생한 이유
- cmd와 x에 각각 명령어를 문자열로 입력받고 정수를 입력받으려고 했으나 정수를 입력하지 않는 명령어도 존재하기 때문에 “not enough values to unpack” 오류가 생김
- stack.pop() 에서 스택이 비어있지 않은 경우 스택에서 요소를 출력하려면 print(stack.pop()) 으로 바꾸어야함
- top 명령어에서 스택의 최상단 요소를 출력하기 위해서는 stack.data[-1]이 아닌 stack[-1]만 입력해도 됨 (구글에서 주워왔는데 글에 오류가 있었던듯함)
위의 코드를 고친 코드
N = int(input())
stack = []
for _ in range(N):
command = input().split()
if command[0] == 'push':
x = int(command[1])
stack.append(x)
elif command[0] == 'pop':
if not stack:
print('-1')
else:
print(stack.pop())
elif command[0] == 'size':
print(len(stack))
elif command[0] == 'empty':
if not stack:
print('1')
else:
print('0')
elif command[0] == 'top':
if not stack:
print('-1')
else:
print(stack[-1])
그러나 이 코드를 제출하니 시간 초과라는 결과가 나옴 → 컴파일 시간이 너무 길었던 것
그래서 빠른 컴파일 속도를 위해 sys.stdin.readline()을 쓰기로 함
최종 제출 코드
#input()을 쓰면 시간초과가 되어
#sys.stdin.readline()을 쓰기 위해 불러옴
import sys
#명령어를 N개 받기 위해 입력받음
N = int(sys.stdin.readline())
#스택 만들어줌
stack = []
#명령어를 N번 입력받게 for문을 만듬
for _ in range(N):
#cmd라는 리스트에 명령어와 정수를 띄어쓰기를 기준으로 나누어서 각각 입력
cmd = sys.stdin.readline().split()
if cmd[0] == 'push': #push 기능
stack.append(cmd[1]) #append를 써서 cmd 2번 인덱스에 들어있는
#정수를 스택에 넣어줌
elif cmd[0] == 'pop': #pop기능
if not stack:
print ('-1') #스택이 비어있으면 -1을 출력
else:
print(stack.pop())
elif cmd[0] == 'size': #size기능 ''
print(len(stack)) #스택 길이를 프린트로 출력
elif cmd[0] == 'empty': #empty기능 ''
if not stack:
print ('1') #스택이 비어있다면 1을 출력
else:
print ('0') #아니라면 0을 출력
elif cmd[0] == 'top':
if not stack:
print (-1) #스택이 비어있다면 -1을 출력
else:
print (stack[-1]) #스택의 최상단 요소를 출력
해결~~!~!~!@~#!@#!!