고래강이 2025. 2. 3. 14:14

백준 10828번

 


🌈 문제 풀기 전 내 생각

1. 간단하게 stack에 대한 조건을 하나씩 구현해나가면 될 것 같다 문제를 잘 읽고 풀어보자.

소요 시간: 30분

 


 

☄️ 문제 풀이 코드

import sys
# stack 실버 4
def beginner():
    N = int(input())
    stack = []
    for _ in range(N):
        action = sys.stdin.readline().split()
        if len(action) > 1:
            _, value = action
            stack.append(value)
        elif 'top' in action:
            print(stack[len(stack) - 1])
        elif 'size' in action:
            print(len(stack))
        elif 'empty' in action:
            print(int(len(stack) == 0))
        else:
            if len(stack) == 0:
                print(-1)
            else:
                print(stack.pop())
        print(stack)
beginner()
  • 문제를 풀면서 2번의 에러를 만나게 되었는데 처음에는 RuntimeError(IndexError), 두번째는 출력 초과로 왜 이렇게 나왔는지 잘 몰랐지만 해결할 수 있었다. 처음에 의심했던 부분은 조건문 부분인데 'top' == action[0]이 부분을 "top" in action 이런식으로 조건을 만든 것과 input()으로 값을 가져올 때가 문제일 수도 있다 생각했지만 아니였다.
  • 이후 코드를 분석하면서 top에서의 코드 중 stack[len(stack) - 1]에서 len(stack)일 때 0을 출력한 뒤 stack[-1]이면 문제가 생긴다는 것을 알게 되었다. 즉 값이 없는 배열에서 stack[-1]을 사용하면 indexError가 발생한다.
  • 이후 출력초과는 어떤 부분에서 발생했는지 잘 모르겠지만 해당 사항을 고쳤더니 해결이 되었다.

 

☄️ 최종 결과 코드

import sys

def beginner():
    N = int(sys.stdin.readline())
    stack = []
    
    for _ in range(N):
        action = sys.stdin.readline().split()

        if len(action) > 1:  # push X
            _, value = action
            stack.append(value)
        
        elif action[0] == 'top':  # top
            print(stack[-1] if stack else -1)
        
        elif action[0] == 'size':  # size
            print(len(stack))
        
        elif action[0] == 'empty':  # empty
            print(1 if not stack else 0)
        
        elif action[0] == 'pop':  # pop
            print(stack.pop() if stack else -1)

beginner()
  • 빈 배열은 Falsly한 값인데 이걸 자꾸 헷갈린다.
  • python에서의 삼항 연산자 사용 방법을 알게되었다 (자주 애용할 듯)
    • 값1 if 조건 else 값 2:True일 경우 값1을 False일 경우 값2를 출력