Baekjoon 10828번 스택

노그리·2022년 5월 10일
0

📑 Algorithm

목록 보기
8/15

💭 문제가 궁금하다면?

내가 시도한 방법

  • 사실 stack을 구현하기만 하면 되는 문제라 크게 어려움은 없었지만,

  • 두 가지 버전으로 stack을 구현하는 것을 연습했다.
    1. .append().pop()을 사용한 버전
    2. top을 이용하여 구현한 버전 쓰지 않은 버전

  • 그리고 top을 이용한 방법이 항상 빠른 것은 아니다는 것을 기록하려고 코드를 올려본다.

  • 추가로 이 문제에서 잠깐 고민한 곳이 데이터 입력인데('push'일때만 stack에 추가할 값이 들어오는데) 이 부분을 패킹(*X) 연산자를 통해 해결했다.

(1) 리스트 메소드를 활용한 코드

  • push가 나오면, .append()를 이용해서 추가
  • pop이 나오면, 빈 배열이 아닐 때에만 .pop()을 이용해서 제거
  • 명령어마다 빈 리스트가 아닌지 확인하고 상황에 따라 요구한 값 출력
from sys import stdin

N = int(input())
lst = []

for _ in range(N):
    command, *X = stdin.readline().rstrip().split() 

    if command == 'push':
        lst.append(int(*X))

    elif command == 'pop':
        if not lst:
            print(-1)
        else:
            print(lst.pop())

    elif command == 'size':
        print(len(lst))

    elif command == 'empty':
        if not lst:
            print(1)
        else:
            print(0)

    else:
        if not lst:
            print(-1)
        else:
            print(lst[-1])

(2) 인덱스(top)를 활용한 코드

  • top을 이용해서 stack에 값이 추가될 때 +1
  • 값이 제거될 때는 -1
  • stack이 비었는지(top이 음수), size가 몇인지(top+1) 등 추가 연산하면 됨
  • 배열의 길이를 조절하는 게 아니여서 더 빠를 줄 알았는데,
    top으로 stack을 구현하려면, 처음에 stack길이 설정을 N으로 해야해서....쓸 데 없는 빈 공간이 많이 만들어져서 그런지...그렇게 빠르지 않았다. 심지어 위의 코드보다 더 느렸다.
from sys import stdin
N = int(input())
lst = [0] * N
top = -1
for _ in range(N):
    command, *X = stdin.readline().rstrip().split()

    if command == 'push':
        top += 1
        lst[top] = int(*X)

    elif command == 'pop':
        if top < 0:
            print(-1)
        else:
            print(lst[top])
            top -= 1

    elif command == 'size':
        print(top+1)

    elif command == 'empty':
        if top < 0:
            print(1)
        else:
            print(0)

    else:
        if top < 0:
            print(-1)
        else:
            print(lst[top])
profile
자기소개가 싫어요

0개의 댓글