본문 바로가기
코딩테스트/백준 알고리즘

백준 알고리즘 | 1874 : 스택 수열 (Python / 파이썬)

by 함께 공부해요 2020. 11. 23.


스택 수열 성공분류

시간 제한

메모리 제한

제출

정답

맞은 사람

정답 비율

2 초

128 MB

42980

13832

10074

32.501%

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

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net


문제

스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 제일 나중에 들어간 자료가 제일 먼저 나오는 (LIFO, Last in First out) 특성을 가지고 있다.

1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을 작성하라.

입력

첫 줄에 n (1 ≤ n ≤ 100,000)이 주어진다. 둘째 줄부터 n개의 줄에는 수열을 이루는 1이상 n이하의 정수가 하나씩 순서대로 주어진다. 물론 같은 정수가 두 번 나오는 일은 없다.

출력

입력된 수열을 만들기 위해 필요한 연산을 한 줄에 한 개씩 출력한다. push연산은 +로, pop 연산은 -로 표현하도록 한다. 불가능한 경우 NO를 출력한다.

알고리즘 분류

자료 구조

스택


 

백준 알고리즘 # 1874번 : 스택 수열

https://ooeunz.tistory.com/7

 

[Python] Stack 사용하기

파이썬에서의 스택 = list를 사용 파이썬은 스택 자료구조는 따로 제공하지 않는다. 다만 기본 클래스인 list를 통해 스택을 흉내 낼 수 있다. 스택은 어떤 자료구조인가요? 스택은 가장 나중에 들

ooeunz.tistory.com

n = int(input())
stack = []
result = []
count = 0
X = True

for _ in range(n):
    num = int(input())

    while count < num:
        count += 1
        stack.append(count)
        result.append("+")

    if stack[-1] == num:
        stack.pop()
        result.append("-")
    else:
        X = False
        break

if X == False:
    print("NO")
else:
    for i in result:
        print(i)

풀이

스택 문제를 오랜만에 풀기 위해서 종이와 펜을 꺼냈어요...ㅋㅋㅋㅋ

간단한 스택에 대한 개념은 위에 출처로 남긴 블로그에 들어가시면 공부하실 수 있어요👍

key point 1

본격적으로 풀이를 해보면, stack이 저장될 리스트result로 표현할 리스트를 일단 따로 설정해줘요.

다음으로 count 변수를 0으로 초기화 시킨 후 문제 조건에 맞게 possible 변수를 설정해서

표현이 불가능할 경우에는 "NO"가 나오도록 만들어봤어요.

n 변수로 8개의 반복을 돌릴 수 있는 정수를 입력 받고, for문으로 8번 반복을 해줘요.

num 변수를 추가로 만들어서 예제 입력 1로 각각 주어지는 4, 3, 6, 8, 7, 5, 2, 1

key point 2

while 반복문을 통해서 count가 입력받은 num보다 작을 때 돌아가게끔 하고

stack이 비어있을 경우에 대비해서 count를 바로 1 증가시켜준 뒤

stack에 append 함수를 통해서 count의 수인 1을 push(입력)해요.

그리고 result에는 stack에 push가 된 것이니 "+"를 append 하면 1단계 끝.

위 결과 stack = [1], result = ["+"] 이렇게 저장됐을거에요.

key point 3

다음으로 top, 즉 stack에 제일 꼭대기에 있는 것을 stack[-1]로 설정해주고

if문을 통해서 만약 top이 num로 들어온 수와 같다면

pop 함수를 통해서 그 수를 빼주고 result에는 "-"를 append(추가)해요.

그리고 반대로 else, top이 num로 들어온 수와 같지 않다면 possible를 False로 초기화해주고 break 시켜요.

이제 마지막으로 possible이 False면 "NO"를 print하고

아닐 경우에는 result 리스트에 저장된 문자열을 for문을 통해서 차례로 출력해주면 끄--읏!!

스택에 대한 공부는 꾸준히 해야겠네요...!!😂

세한 코드가 궁금하신 분들은 아래 GitHub 코드를 참고해주세요🙏

 

wook2124/Algorithm-Test

Practice algorithm. Contribute to wook2124/Algorithm-Test development by creating an account on GitHub.

github.com

최종 소스코드

 

댓글