본문 바로가기
알고리즘/BOJ

[BOJ] 10828번 스택 / 사용언어 : 파이썬(python)

by 바른 호랑이 2021. 12. 16.
728x90
반응형

※ 문제링크 

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

※ 관련 알고리즘 설명 

 

스택 - 위키백과, 우리 모두의 백과사전

스택(stack)은 제한적으로 접근할 수 있는 나열 구조이다. 그 접근 방법은 언제나 목록의 끝에서만 일어난다. 끝먼저내기 목록(Pushdown list)이라고도 한다. 스택은 한 쪽 끝에서만 자료를 넣거나 뺄

ko.wikipedia.org

※ 문제풀이

class stack: # 스택구현부분
    def __init__(self):
        self.result = []
    
    def push(self, X):
        self.result.append(X)

    def pop(self):
        if len(self.result) == 0:
            return -1
        else:
            return self.result.pop()

    def size(self):
        return len(self.result)
    
    def empty(self):
        if len(self.result) == 0:
            return 1
        else:
            return 0
    
    def top(self):
        if len(self.result) == 0:
            return -1
        else:
            return self.result[-1]

# 시간초과해결을 위해 sys함수 사용
import sys 
N = int(input())
# N = int(sys.stdin.readline())
result = stack()
for i in range(N):
    order = input()
    # order = sys.stdin.readline().rstrip()
    if 'push' in order:
        result.push(order.split()[1])
    elif 'pop' == order:
        if i == (N-1):
            sys.stdout.write(f'{result.pop()}')
        else:
            sys.stdout.write(f'{result.pop()}\n')
    elif 'size' == order:
        if i == (N-1):
            sys.stdout.write(f'{result.size()}')
        else:
            sys.stdout.write(f'{result.size()}\n')
    elif 'empty' == order:
        if i == (N-1):
            sys.stdout.write(f'{result.empty()}')
        else:
            sys.stdout.write(f'{result.empty()}\n')
    elif 'top' == order:
        if i == (N-1):
            sys.stdout.write(f'{result.top()}')
        else:
            sys.stdout.write(f'{result.top()}\n')
    else:
        pass

 

해당문제는 스택과 관련된 가장 기초적인 문제였다. 실제 구현을 위해서 클래스와 함수선언을 하는 형식으로 문제를 해결하였고, 백준의 문제풀이 특성상 print문을 다수 호출하면 시간초과가 되는 것을 고려하여 sys함수를 사용하여 시간초과문제를 해결하였다.  구현자체는 append와 pop만 사용하면 되는 것이라 크게 어렵지 않았다.

- pop(): 리스트의 맨뒤 요소를 삭제하고 해당요소값을 반환하는 함수

다만 실제 출력문을 입력할때 sys.stdout.write를 쓰게되면 반드시 문자열 형태로 입력을 해주어야 한다는 점과  끝나는 지점에 띄어쓰기나 줄바꿈을 자동입력해주지 않기때문에 입력을 해주어야한다는 점, 그리고 백준의 특성상 개행문자가 들어가면 틀렷다고하기때문에 맨마지막으로 입력된 문자열에는 \n을 제거해야한다는 점 때문에 출력문장이 길어졌다. 혹시라도 시간초과로 고민하고 있는 사람이 있다면 참고해도 좋을 것 같다.

 

P.S 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글