HanSol's Oak Cask

백준 10828번: 스택 (Python) 본문

알고리즘, 코딩테스트

백준 10828번: 스택 (Python)

HanSol_Lim 2025. 2. 18. 09:43

🔹 문제 설명

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성한다.

명령어는 총 5가지이다.

  1. push X: 정수 X를 스택에 넣는다.
  2. pop: 스택에서 가장 위에 있는 정수를 제거하고 출력한다. 스택이 비어있으면 -1을 출력한다.
  3. size: 스택에 들어있는 정수의 개수를 출력한다.
  4. empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  5. top: 스택의 가장 위에 있는 정수를 출력한다. 스택이 비어있으면 -1을 출력한다.

🔹 내가 처음 작성한 코드

import sys
n = int(sys.stdin.readline())

stack = []
for _ in range(n):
    command = sys.stdin.readline()
    
    # push
    if "push" in command:
        stack.append(int(command.split()[1]))
    # pop
    if command == "pop":
        if len(stack) == 0:
            print(-1)
        else:
            print(stack.pop())
    # size
    if command == "size":
        print(len(stack))
    # empty
    if command == "empty":
        if len(stack) == 0:
            print(1)
        else:
            print(-1)  # ❌ 잘못된 출력
    # top
    if command == "top":
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[-1])

🔹 틀린 이유 분석

  1. 개행 문자(\n) 제거 필요
    • sys.stdin.readline()을 사용하면 입력값 끝에 개행 문자(\n)가 포함된다.
    • 따라서 "pop"을 입력하면 command = "pop\n"이 되어 if command == "pop":이 False가 된다.
    • ✅ 해결 방법: .strip()을 사용하여 개행 문자 제거.
  2. "push" in command 조건이 불명확
    • "pushpop" 같은 이상한 입력이 들어오면 push로 인식할 가능성이 있음.
    • ✅ 해결 방법: command.startswith("push") 사용.
  3. empty 명령어에서 출력값 오류
    • 스택이 비어있으면 1, 비어있지 않으면 0을 출력해야 한다.
    • ✅ 해결 방법: else: print(0)으로 수정.
  4. if command == "empty": if len(stack) == 0: print(1) else: print(-1) # ❌ 정답은 0이어야 함
  5. if-else 구조 최적화 가능
    • print(stack.pop() if stack else -1)처럼 간결한 표현이 가능.

🔹 올바르게 수정된 코드

import sys

n = int(sys.stdin.readline().strip())  # 개행 문자 제거

stack = []
for _ in range(n):
    command = sys.stdin.readline().strip()  # 개행 문자 제거
    
    # push X
    if command.startswith("push"):  
        stack.append(int(command.split()[1]))  

    # pop
    elif command == "pop":
        print(stack.pop() if stack else -1)

    # size
    elif command == "size":
        print(len(stack))

    # empty
    elif command == "empty":
        print(1 if not stack else 0)  # 0으로 수정

    # top
    elif command == "top":
        print(stack[-1] if stack else -1)

🔹 수정된 코드의 개선점

문제점 기존 코드 수정된 코드

개행 문자 제거 필요 command = sys.stdin.readline() command = sys.stdin.readline().strip()
"push" in command 문제 "push" in command (불명확) command.startswith("push") (정확한 비교)
empty 출력 오류 print(-1) print(0)
불필요한 if-else 구조 if len(stack) == 0: print(-1) else: print(stack[-1]) print(stack[-1] if stack else -1) (더 간결함)

🔹 결론

.strip()을 사용하여 개행 문자 제거
startswith("push")를 사용하여 명확한 명령어 판별
empty 명령에서 올바른 값(0, 1) 출력하도록 수정
if-else 대신 삼항 연산자로 코드 간결화 🚀🔥