본문 바로가기

Baekjoon

[Baekjoon]백준 28278 스택2(실버 4) - Python

문제설명
예제

문제를 읽어보면 명령어를 입력받아 각 명령어마다 적절한 동작을 하도록 구현하면 된다

스택은 LIFO(Last In First Out) 구조로 데이터를 쌓아올린 구조이다

스택에 1, 2, 3, 4, 5를 순서대로 넣으면 
5

4

3

2

1

과 같은 형식으로 저장이 된다

이를 파이썬에서 리스트로 나타내면 배열의 끝자리에서만 데이터가 이동한다고 생각하면 된다

리스트에 [1, 2, 3, 4, 5]가 들어있다면 (배열의 길이 - 1)인덱스에서 데이터의 삽입과 삭제가 이루어진다

 

1번 명령어의 경우 두 가지를 입력받아야하므로 .split()을 사용하여 모든 명령어를 입력받도록 구현하였다

그리고 각 명령어마다 적절한 역할을 하도록 작성을 하여 제출을 하였는데 시간초과가 발생한다...

import sys

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

for _ in range(n):
    cmd = sys.stdin.readline().split()
    if cmd[0] == '1':
        stack.append(cmd[1])
    elif cmd[0] == '2':
        if stack:
            print(stack[-1])
            stack.remove(stack[-1])
        else:
            print(-1)
    elif cmd[0] == '3':
        print(len(stack))
    elif cmd[0] == '4':
        if stack:
            print(0)
        else:
            print(1)
    else:
        if stack:
            print(stack[-1])
        else:
            print(-1)

일부러 시간초과가 발생할까봐 input() 대신 sys.stdin.readline()을 사용하였는데 다른 곳을 수정해야할 것 같았다

2번 명령어 부분을 작성할 때 remove를 사용하였는데,

찾아보니 pop 연산자를 사용하면 삭제와 호출을 동시에 해주므로 더 빠른 동작이 이루어질 수 있었다

이를 적용하여 다시 제출을 하니 맞았습니다!! 라는 문구를 확인할 수 있었다

import sys

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

for _ in range(n):
    cmd = sys.stdin.readline().split()
    if cmd[0] == '1':
        stack.append(cmd[1])
    elif cmd[0] == '2':
        if stack:
            print(stack.pop(-1))
        else:
            print(-1)
    elif cmd[0] == '3':
        print(len(stack))
    elif cmd[0] == '4':
        if stack:
            print(0)
        else:
            print(1)
    else:
        if stack:
            print(stack[-1])
        else:
            print(-1)