본문 바로가기

알고리즘 삽질장

[BOJ] 1874번 - 스택 수열

반응형


문제설명

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

사고과정

  • 문제 이해하는 데 시간이 걸렸다. 그리고 스택을 이용해야 하는데, 1부터 수열의 원소 하나하나까지 push하고 그 원소값에 해당하면 pop해야 하는 건 알겠는데 코드로 구현하지는 못했다..
  • 구글링을 해보았고 핵심 포인트는 특정 숫자를 입력받을 때마다 그 숫자가 같아질 때까지 1부터~그 숫자를 스택에 push 하고 스택 가장 위의 값이 그 숫자와 같으면 바로 pop 해주면 된다. 그리고 pop해줄 때 만약 x랑 같지 않다면 NO를 출력한다. 

풀이(스스로 못 푼 풀이)

n = int(input())
stack = []
result = []
count = 1
flag = False

for _ in range(n):
    x = int(input())
    # count가 x가 될때까지 스택에 넣기
    while count <= x:
        stack.append(count)
        result.append('+')
        count += 1
    if stack[-1] == x:
        stack.pop()
        result.append('-')
    # 스택 마지막 값이 x보다 크면 NO!
    else:
        flag = True
        break
if flag:
    print('NO')
else:
    print('\n'.join(result))

 

추가로 연습한 풀이

import sys
input = sys.stdin.readline
n = int(input())
stack = []
result = []
i = 1
for _ in range(n):
    a = int(input())
    while i <= a:
        stack.append(i)
        result.append('+')
        i += 1
    if stack[-1] < a:
        result = 'NO'
        break
    stack.pop()
    result.append('-')

if result == 'NO':
    print(result)
else:
    for res in result:
        print(res)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[BOJ] 10845번 - 큐  (0) 2021.10.24
[BOJ] 1406번 - 에디터  (0) 2021.10.24
[BOJ] 9012번 - 괄호  (0) 2021.10.23
[BOJ] 9093번 - 단어 뒤집기  (0) 2021.10.23
[BOJ] 10828번 - 스택  (0) 2021.10.23