μŠ€νƒ μˆ˜μ—΄

πŸ“„ 문제

문제

μŠ€νƒ (stack)은 기본적인 자료ꡬ쑰 쀑 ν•˜λ‚˜λ‘œ, 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ 자주 μ΄μš©λ˜λŠ” κ°œλ…μ΄λ‹€.
μŠ€νƒμ€ 자료λ₯Ό λ„£λŠ” (push) μž…κ΅¬μ™€ 자료λ₯Ό λ½‘λŠ” (pop) μž…κ΅¬κ°€ κ°™μ•„
제일 λ‚˜μ€‘μ— λ“€μ–΄κ°„ μžλ£Œκ°€ 제일 λ¨Όμ € λ‚˜μ˜€λŠ” (LIFO, Last in First out) νŠΉμ„±μ„ 가지고 μžˆλ‹€.

1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό μŠ€νƒμ— λ„£μ—ˆλ‹€κ°€ 뽑아 λŠ˜μ–΄λ†“μŒμœΌλ‘œμ¨, ν•˜λ‚˜μ˜ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.
μ΄λ•Œ, μŠ€νƒμ— pushν•˜λŠ” μˆœμ„œλŠ” λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμ„ 지킀도둝 ν•œλ‹€κ³  ν•˜μž.
μž„μ˜μ˜ μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μŠ€νƒμ„ μ΄μš©ν•΄ κ·Έ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€,
μžˆλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ push와 pop 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€.
이λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯

첫 쀄에 n (1 ≤ n ≤ 100,000)이 주어진닀.
λ‘˜μ§Έ 쀄뢀터 n개의 μ€„μ—λŠ” μˆ˜μ—΄μ„ μ΄λ£¨λŠ” 1이상 nμ΄ν•˜μ˜ μ •μˆ˜κ°€ ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ 주어진닀.
λ¬Όλ‘  같은 μ •μˆ˜κ°€ 두 번 λ‚˜μ˜€λŠ” 일은 μ—†λ‹€.

좜λ ₯

μž…λ ₯된 μˆ˜μ—΄μ„ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ 연산을 ν•œ 쀄에 ν•œ κ°œμ”© 좜λ ₯ν•œλ‹€.
push연산은 +둜, pop 연산은 -둜 ν‘œν˜„ν•˜λ„λ‘ ν•œλ‹€. λΆˆκ°€λŠ₯ν•œ 경우 NOλ₯Ό 좜λ ₯ν•œλ‹€.

🧞 풀이

더보기

풀이 (μ‹œκ°„ 초과) (μ§€κΈˆ ν™•μΈν•˜λ‹ˆ, νŠΉμ • μž…λ ₯값에 λŒ€ν•œ 였λ₯˜λ„ 있음)

# 100,000에 μ œν•œ μ‹œκ°„ 2초면 이쀑 for문을 돌릴 λ•Œ, ν™•μ •μ μœΌλ‘œ μ‹œκ°„ μ΄ˆκ³Όκ°€ λ‚œλ‹€. 

# [파이썬] λ°±μ€€ 1874번 문제: μŠ€νƒ μˆ˜μ—΄

import sys

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

stack = []
c_list = []

for _ in range(n):
    tmp = int(sys.stdin.readline())
    for i in range(1, tmp+1):
        if i not in stack and i not in c_list:
            stack.append(i)
            print('+')
    c_list.append(stack.pop())
    print('-')

 

λ‹€λ₯Έ μ‚¬λžŒ 풀이

n = int(input())                    # n μž…λ ₯ 및 ν• λ‹Ή
stack = []                          # 빈 μŠ€νƒ ν• λ‹Ή
result = []                         # κ²°κ³Όκ°’ 담을 리슀트 ν• λ‹Ή
count = 0                           # λ“€μ–΄κ°„ 숫자λ₯Ό μ…€ count λ³€μˆ˜ ν• λ‹Ή
X = True                            # λΆˆκ°€λŠ₯ν•  경우 False둜 λ°”κΏ”μ€Œ

for _ in range(n):                  # n만큼 반볡
    num = int(input())              # num에 숫자 μž…λ ₯ λ°›μŒ

    while count < num:              # countκ°€ num보닀 크지 μ•Šμ„ 경우 계속 반볡
        count += 1                  # count 1 증가
        stack.append(count)         # μŠ€νƒμ— count μΆ”κ°€
        result.append("+")          # result λ¦¬μŠ€νŠΈμ—λ„ '+' μΆ”κ°€

    if stack[-1] == num:            # stack의 λ§ˆμ§€λ§‰ μˆ«μžκ°€ numκ³Ό 같을 λ•Œ,
        stack.pop()                 # ν•΄λ‹Ή 숫자λ₯Ό pop()
        result.append("-")          # λ™μ‹œμ— result λ¦¬μŠ€νŠΈμ— '-' μΆ”κ°€
    else:
        X = False                   # 그렇지 μ•Šμ„ 경우, False둜 X 값을 λ³€ν™˜
        break                       # 이후 breakλ₯Ό 톡해 λ°”λ‘œ 반볡문 μ’…λ£Œ

if X == False:                      # λ§Œμ•½ Xκ°€ False 값이면
    print("NO")                     # 'No'λ₯Ό 좜λ ₯
else:
    for i in result:                # result 리슀트의 각 μš”μ†Œ λ³„λ‘œ
        print(i)                    # 좜λ ₯

+ Recent posts