πŸ‘©πŸ»‍🌾

[λ°±μ€€/Python] 1874번 μŠ€νƒμœΌλ‘œ μˆ˜μ—΄ λ§Œλ“€κΈ° λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ/λ°±μ€€(BOJ)

[λ°±μ€€/Python] 1874번 μŠ€νƒμœΌλ‘œ μˆ˜μ—΄ λ§Œλ“€κΈ°

μ₯¬μŠ€μ΄ 2023. 2. 5. 16:26
728x90

1οΈβƒ£λ¬Έμ œ μ„€λͺ…

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

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

2οΈβƒ£μž…λ ₯

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

3οΈβƒ£μΆœλ ₯

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


πŸ‘©πŸ»‍πŸ’»μž‘μ„±ν•œ μ½”λ“œ

import sys

input = sys.stdin.readline

n = int(input())    # μž…λ ₯ 받을 데이터 개수
a = 1
stack = []  # μ£Όμ–΄μ§„ μˆ˜μ—΄μ„ 담을 stack
sign = []    # pop, push 정보 담을 list
res = True

for i in range(n):
    num = int(input())
    while a <= num:
        stack.append(a)
        sign.append('+')
        a += 1
    if stack[-1] == num:
        stack.pop()
        sign.append('-')
    else:
        print("NO")
        res = False
        break

if res:
    for i in sign:
        print(i)

πŸ’‘μ½”λ“œ μ„€λͺ…

μš°μ„ , forλ¬Έ μ•ˆμ—μ„œ μˆ˜μ—΄μ˜ 데이터λ₯Ό μž…λ ₯ λ°›κ³ , whileλ¬Έμ—μ„œλŠ” μž…λ ₯ 받은 numκ³Ό aκ°€ κ°™μ•„μ§ˆ λ•ŒκΉŒμ§€ stack에 1~numκΉŒμ§€ appendν•΄μ£Όκ³  appendν•΄μ€€ 횟수만큼 signμ—λŠ” '+'λ₯Ό appendν•΄μ€€λ‹€.

 

그런 λ‹€μŒ λ§Œμ•½ μŠ€νƒμ˜ top의 값이 μž…λ ₯ 받은 numκ³Ό κ°™μ•„μ§€λ©΄ ν•΄λ‹Ή 값을 popμ‹œν‚€κ³ , pop μ‹œν‚¨ 정보λ₯Ό sign에 '-'둜 appendν•΄μ€€λ‹€.

 

λ§Œμ•½ numκ³Ό κ°™μ§€ μ•Šλ‹€λ©΄ μˆ˜μ—΄μ„ λ§Œλ“œλŠ” 것이 λΆˆκ°€λŠ₯ν•œ 경우둜 NOλ₯Ό 좜λ ₯ν•˜κ³  res의 값을 False둜 μ €μž₯ν•œλ‹€. -> 이후 res의 값이 False이면 μˆ˜μ—΄μ„ λ§Œλ“œλŠ” 것이 λΆˆκ°€λŠ₯ν–ˆλ‹€λŠ” κ²ƒμ΄λ―€λ‘œ κ²°κ³Ό 좜λ ₯ λ•Œ 쑰건으둜 μ‚¬μš©λ  μ˜ˆμ •

 

λ§ˆμ§€λ§‰μœΌλ‘œ resκ°€ True라면 μˆ˜μ—΄μ˜ 값을 좜λ ₯ν•  수 있게 ν•œλ‹€.

728x90
Comments