[백준] 스택 수열 1874번 파이썬 Python 자료구조

Jeony·2021년 9월 28일
0

백준

목록 보기
4/25
post-thumbnail

📌문제 접근

이 문제의 경우 대다수의 사람들이 지문 이해가 어렵다고 한다.

지문에서 말하는 조건

  1. 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자.
    -> 주어진 수를 활용하되 꼭 주어진 수로 push를 하라는 말이 아님.
    push는 꼭 오름차순 수열.

  2. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지,
    있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다.
    -> 4, 3, 6, 8, 7, 5, 2, 1의 수열이 주어졌을 때 (니가 만든) 스택을 이용해서 오름차순 push를 하고 거기서 pop을 했을 때의 수열을 4, 3, 6, 8, 7, 5, 2, 1로 만들어라.

📌내가 작성한 코드

stack = []
result = []
count = 1
flag = 1

n = int(input())
for i in range(n):
    command = int(input())
    
    while count <= command:
        stack.append(count)
        result.append("+")
        count += 1
    
    if stack[-1] == command:
        stack.pop()
        result.append("-")
    else:
        print('NO')
        flag = 0
        break

if flag == 1:
    for i in range(len(result)):
       print(result[i])

📌풀이

  1. 쌓을 스택의 공간을 만들어준다.
  2. 결과 값을 저자할 공간을 만들어준다. (리스트로 저장해 놓았다가 한번에 출력할 예정)
  3. 오름차순으로 쌓기위해 계속 플러스 해 줄 count를 1로 초기화 해준다.
  4. 수열로 만들기 성공하면 그대로 1, 실패하면 0으로 받을 변수 선언.
stack = []
result = []
count = 1
flag = 1
  1. 내가 임의로 입력해줄 수의 총 개수를 받는다.
  2. for문에 총 개수만큼 반복시키고 그 반복문 안에서 총 개수의 수만큼 입력을 받는다.
n = int(input())
for i in range(n):
    command = int(input())
  1. count로 오름차순 스택을 쌓는다. 단, pop한 숫자들의 수열이 입력받은 4, 3, 6, 8, 7, 5, 2, 1 처럼 되기 위해서 command보다 작거나 같을 때에만 쌓는다.
    for문 안에서 count가 입력받은 4, 3, 6, 8, 7, 5, 2, 1 중 맨 처음 4보다 작거나 같을 동안 count를 1씩 증가시켜서 오름차순으로 스택을 쌓고 결과는 한 번에 출력하기 위해서 result 리스트에 넣어둔다.
while count <= command:
        stack.append(count)
        result.append("+")
        count += 1
  1. 스택 마지막 숫자와 입력받은 숫자가 같으면 pop을 해준다.
    while문을 나와서 stack에 마지막에 있는 숫자가 입력받은 4, 3, 6, 8, 7, 5, 2, 1 중 맨 처음 4와 같으면 pop을 해준다. 마찬가지로 한 번에 출력하기 위해서 result 리스트에 넣어둔다.
  2. pop한 숫자들의 수열이 입력받은 수대로 나오지 않으면 "No" 출력
    result를 출력하지 않기 위해서 0으로 변경
    break로 끝내기.
if stack[-1] == command:
        stack.pop()
        result.append("-")
else:
        print('NO')
        flag = 0
        break
  1. result의 값이 1이면 출력하는데 result 리스트 안의 값 수대로 반복시켜서 출력.
if flag == 1:
    for i in range(len(result)):
       print(result[i])
profile
알고리즘으로 문제를 해결하다가 포기함

0개의 댓글