깡뇽

[백준] 10828번 스택 파이썬 본문

Algorithm/BAEKJOON

[백준] 10828번 스택 파이썬

깡뇽 2022. 2. 4. 11:09
반응형

Siver 4 레벨에 해당하는 문제이다. 금방끝내고 싶어서 이 문제를 골랐는데 이상하게 더 많은 틀렸습니다를 만났다...

자료 구조 중에서 스택 구조를 경험해 볼 수 있는 문제이다. push를 하면 스택에 값을 넣고, pop는 스택의 맨 윗 값을 제거하며 반환하고, size는 스택의 크기를 알려주고, empty는 스택이 비워짐을 확인해주고, top은 스택의 맨 윗 값을 반환한다.

 

10828번 스택 풀이

[시도n] pypy3 맞았습니다!!

import sys

n = int(input())
stack = []

for i in range(n):
  say = sys.stdin.readline().rstrip()
  if 'push' in say:
    num = say.split()
    stack.append(num[-1])
  elif say == 'pop':
    if len(stack) == 0:
      print(-1)
    else:
      print(stack[-1])
      stack.pop()
  elif say == 'size':
    print(len(stack))
  elif say == 'empty':
    if len(stack) == 0:
      print(1)
    else:
      print(0)
  elif say == 'top':
    if len(stack) == 0:
      print(-1)
    else:
      print(stack[-1])

1) 우선 디버깅을 위해 print해둔 부분을 지우지 않아서 '출력 초과' 를 만났다. (디버깅 출력 좀 잘 확인하자!!)

2) 시간 초과를 방지하기 위해서 input()이 아닌 sys.stdin.readline()을 사용해야 하는 문제였고, 뒤에 rstrip()을 붙여줘야 엔터값까지 입력되는 것을 막을 수 있다. strip(), lstrip(), rstrip()은 문자열에서 양쪽, 왼쪽, 오른쪽의 공백을 삭제해 준다. strip('0')과 같이 인자를 넣으면 다른 문자가 나올 때까지 해당 문자는 다 지운다. '00happy1000'을 rstrip('0')하면 '00happy1'이 된다.

3) 맨 처음에 push를 할 때에 인덱스를 사용해서 say에 push 1이 입력되면 say[-1]을 넣도록 구현했었는데 이렇게 되면 123과 같은 한자리 이상의 숫자는 제대로 넣어지지 않는다. 위의 코드처럼 split()을 사용해서 해당 값만 분류해서 스택에 넣어주거나 인덱싱을 사용할 것이라면 say[5:]로 해줘야 한다. 

4) 파이썬 list는 pop() 함수를 지원한다. 리스트의 맨 끝 값을 제거한다.

5) else의 들여쓰기를 잘못해주어 '컴파일 에러'도 만났는데 백준에서 컴파일 에러는 클릭하면 무엇이 문제인지 알려주더라!

6) if elif else 문에서 else를 꼭 써줘야 하는 것은 아니다. 당연한 말이지만 else: continue > else : break > else없음 순서로 실행 시간이 적게 나온다.

 

#1

 

#2

 

https://www.acmicpc.net/problem/10828

 

10828번: 스택

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

www.acmicpc.net

반응형