μ΅œλŒ€ 1 λΆ„ μ†Œμš”

μŠ€νƒ(Stack)μ΄λž€?

μŠ€νƒμ€ λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ μš”μ†Œκ°€ λ¨Όμ € λ‚˜κ°€λŠ” ν˜•μ‹μΈ LIFO(Last In First Out)의 μ„±μ§ˆμ„ κ°–λŠ” μ„ ν˜• 자료 ꡬ쑰이닀.
νŒŒμ΄μ¬μ—μ„œλŠ” 리슀트λ₯Ό 생각할 수 μžˆλ‹€.
λ¦¬μŠ€νŠΈλŠ” append()와 pop()의 2가지 연산이 κ°€λŠ₯ν•˜λ‹€.
λ‘˜ λ‹€ κ°€μž₯ 뒀에 μš”μ†Œλ₯Ό μΆ”κ°€, μΆ”μΆœν•˜λŠ” ν•¨μˆ˜λ‘œ, 맨 λ’€μ—μ„œλ§Œ 연산이 이루어진닀.
μ‰½κ²Œ μƒκ°ν•˜λ©΄ μž…μΆœκ΅¬κ°€ ν•˜λ‚˜ 뿐인 방이라고 생각할 수 μžˆλ‹€.

λ°±μ€€ μŠ€νƒμˆ˜μ—΄

문제: https://www.acmicpc.net/problem/1874
μŠ€νƒμˆ˜μ—΄ λ¬Έμ œλŠ” μŠ€νƒμ΄ 2κ°œκ°€ ν•„μš”ν•˜λ‹€.
λ¨Όμ €, β€˜+’, β€˜-β€˜λ₯Ό μ €μž₯ν•  result μŠ€νƒμ΄ ν•„μš”ν•˜κ³ , μ‹€μ œλ‘œ 값이 λ“€μ–΄κ°”λ‹€ λ‚˜κ°€λŠ” μš©λ„μ˜ μŠ€νƒμΈ stack ν•„μš”ν•˜λ‹€.

μ½”λ“œ

import sys

n = int(sys.stdin.readline())

stack = []
result = []
find = True
count = 1

for i in range(n):
    num = int(sys.stdin.readline())
    while count <= num:
        stack.append(count)
        result.append('+')
        count+=1
    
    if stack[-1] == num:
        stack.pop()
        result.append('-')
    else:
        find = False

if not find:
    print('NO')
else:
    for i in result:
        print(i)

μ½”λ“œ 뢄석

num에 stack[]에 λ“€μ–΄κ°ˆ μˆ˜κ°€ μž…λ ₯λœλ‹€.
κ·Έ 수만큼 while문이 λ™μž‘ν•˜λ„λ‘ 미리 μ„€μ •ν•΄λ‘” count=1을 ν™œμš©ν•œλ‹€.
countλŠ” λ°˜λ³΅ν•  수둝 count+=1을 ν•˜μ—¬ μ¦κ°€μ‹œμΌœμ£Όκ³ , 이 countλŠ” 반볡문이 λλ‚˜λ©΄ κ²°κ΅­ numμ΄λž‘ 같은 크기의 μˆ˜κ°€ λœλ‹€.
이 countλ₯Ό stack[]에 μΆ”κ°€ν•˜κ³ , λ°˜λ³΅ν•  λ•Œλ§ˆλ‹€ β€˜+’λ₯Ό result[]에 μΆ”κ°€ν•œλ‹€.
λ§Œμ•½, stack[]의 κ°€μž₯ λ§ˆμ§€λ§‰ μˆ˜κ°€ numκ³Ό κ°™λ‹€λ©΄, stack[]μ—μ„œ pop()연산을 μ‹€ν–‰ν•˜κ³  result에 β€˜-β€˜λ₯Ό μΆ”κ°€ν•œλ‹€.
그게 μ•„λ‹ˆλΌλ©΄, find=Falseλ₯Ό μ„€μ •ν•˜μ—¬ 후에 β€œNO”λ₯Ό 좜λ ₯ν•˜λ„λ‘ ν•œλ‹€.

μœ„ λ™μž‘μ΄ λλ‚˜λ©΄ find=True일 κ²½μš°μ— λŒ€ν•΄ resultλ₯Ό μ°¨λ‘€λŒ€λ‘œ 좜λ ₯ν•΄μ£Όλ©΄ λœλ‹€.

참고자료

https://hongcoding.tistory.com/39
https://data-flower.tistory.com/98

λŒ“κΈ€λ‚¨κΈ°κΈ°