✅파이썬 스택 문제(백준 10828번)

이상민·2023년 5월 17일
0

알고리즘

목록 보기
2/128

📖문제

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

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다

📗입력

  • 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

📘출력

  • 출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

📄내가 작성한 코드

import sys

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

stack = []
for _ in range(n):
    command = sys.stdin.readline().split()

    if command[0] == 'push':
        stack.append(command[1])
    elif command[0] == 'pop':
        if len(stack) == 0:
            print(-1)
        else:
            print(stack.pop())
    elif command[0] == 'size':
        print(len(stack))
    elif command[0] == 'empty':
        if len(stack) == 0:
            print(1)
        else:
            print(0)
    elif command[0] == 'top':
        if len(stack) == 0:
            print(-1)
        else:
            print(stack[-1])

👉코드 설명

  • 입력받을시 input() 보다 sys.stdin.readline()가 빠르기 때문에 사용해 주었다.
    int(sys.stdin.readline())로 형변환을 해준다.
  • sys.stdin.readline()에는 개행문자가 포함되어 있는데 이를 sys.stdin.readline().split()으로 사용해서 공백을 구분자로한 문자열을 command에 리스트로 저장한다.
  • n개의 명령어를 실행해야 하므로 for _ in range(n) n만큼 for문을 수행한다. ex) n = 10 =>명령어 10개 수행
  • sys.stdin.readline().split() 통해 command의 첫번째 리스트에는 명령어가 들어간다 따라서 첫번째 리스트에 들어오는 명령어를 비교하는 if문을 만들고, 명령별로 수행할 조건을 설정한다.

❗❗Key Point

  • command = sys.stdin.readline().split()
    공백을 구분자로 하는 입력함수 push X 이것때문에 사용해야 했다.
  • 스택이 비었는지는 len(stack)으로 확인한다.

💢막혔던 부분

  • input()을 사용하지 않고,sys.stdin.readline(), sys.stdin.readline().split()을 사용한 점.
    sys.stdin.readline()의 존재자체를 몰라서 따로 검색하여 찾았다.
  • 처음코드 작성시, 스택이 비었는지를 if stack is None으로 확인했는데,
    stack[ ]의 빈 리스트는 하나의 빈 객체이고, None은 값이 없음을 나타내는 상수값이기 때문에 빈 리스트와 None은 다른 개념이다.
    따라서 stack is None으로 스택이 비었는지를 비교할수는 없다.
    len(stack)==0을 사용하자.
profile
개린이

0개의 댓글