BeakJoon/Python

[Python] 백준 #10828번 : 스택

쿼딩~ 2023. 10. 15. 14:57


이 문제에서 고민했던 것

  • not enough values to unpack 이 오류를 해결하기 위해서는 명령어와 정수를 각각 다른 함수에 입력받으면 안됨 → 정수 입력이 없는 명령어를 실행 할 때는 오류가 생김
    • -> 이 문제는 cmd 라는 리스트로 명령어와 정수를 리스트로 저장하면 정수가 있을 때 없을 때 구분 없이 기능을 하게 되겠구나 깨달음
  • 위 문제를 처음에는 다섯 개의 명령의 이름으로 각각 함수를 따로 정의하고 기능을 추가해서 할 생각이었음
    • -> 하지만 너무 돌아가는 느낌이 있어 그냥 if문과 elif문을 사용하여 명령어를 문자열로 입력받아 조건으로 입력받은 문자열과 명령의 이름과 같으면 그 기능을 구사하게 만들기로 결정함
      • -> but 알고리즘 스터디에서 def 등으로 각각 함수를 따로 정의하는 것이 코딩 할 때 도움이 많이 되는 방식이라고 피드백 받음

코드


맨 처음 만든 코드

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” 오류가 발생함

  • 오류가 발생한 이유
    1. cmd와 x에 각각 명령어를 문자열로 입력받고 정수를 입력받으려고 했으나 정수를 입력하지 않는 명령어도 존재하기 때문에 “not enough values to unpack” 오류가 생김
    2. stack.pop() 에서 스택이 비어있지 않은 경우 스택에서 요소를 출력하려면 print(stack.pop()) 으로 바꾸어야함
    3. 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])   #스택의 최상단 요소를 출력

해결~~!~!~!@~#!@#!!