[λ°±μ€€/python] 1874번 : μŠ€νƒ μˆ˜μ—΄

2021. 3. 12. 00:19

문제

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

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

 

μž…λ ₯

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

 

좜λ ₯

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

 

μ •λ‹΅

n = int(input())
numbers = []
for i in range(n):
    numbers.append(int(input()))

stack = []
result = []
k = 0


def s_pop(s):
    global k
    while n > k and stack and numbers[k] == s[-1]:
        s.pop()
        result.append("-")
        k += 1


for i in range(1, n+1):
    stack.append(i)
    result.append("+")
    if numbers[k] == stack[-1]:
        s_pop(stack)

if n > k:
    print("NO")
else:
    for i in result:
        print(i)

μš°μ„  nκ³Ό n개의 μ •μˆ˜λ₯Ό numbers에 μž…λ ₯λ°›λŠ”λ‹€.

1λΆ€ν„° μ •μˆ˜λ₯Ό μ €μž₯ν•  stackκ³Ό κ²°κ³Όλ₯Ό μ €μž₯ν•  result 배열을 λ§Œλ“€κ³ 

numbers λ°°μ—΄μ˜ λŒ€μƒμ„ 지정할 kλ₯Ό λ§Œλ“€μ–΄ λ°°μ—΄μ˜ 첫번째λ₯Ό 가리킀기 μœ„ν•΄ 0을 μ €μž₯ν•œλ‹€.

for i in range(1, n+1):
    stack.append(i)
    result.append("+")
    if numbers[k] == stack[-1]:
        s_pop(stack)

1λΆ€ν„° nκΉŒμ§€μ˜ 숫자λ₯Ό μ΄μš©ν•˜κΈ° μœ„ν•΄ λ²”μœ„λŠ” 1λΆ€ν„° n+1둜 μ„€μ •ν•˜κ³ 

stack에 1λΆ€ν„° λ„£μœΌλ©΄μ„œ result에 +λ₯Ό μ €μž₯ν•œλ‹€.

 

λ§Œμ•½ μž…λ ₯받은 숫자 numbers의 kλ²ˆμ§Έκ°€ stack의 λ§ˆμ§€λ§‰μ— μ €μž₯된 μˆ«μžμ™€ κ°™λ‹€λ©΄ s_pop ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•œλ‹€.

첫 싀행이라면 numbers의 첫번째 μˆ«μžμ™€ 방금 stack에 넣은 숫자 1이 비ꡐ될 것이닀.

def s_pop(s):
    global k
    while n > k and stack and numbers[k] == s[-1]:
        s.pop()
        result.append("-")
        k += 1

s_pop ν•¨μˆ˜μ—μ„œλ„ λ³€μˆ˜ kλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ global kλ₯Ό μ„ μ–Έν•΄μ€€λ‹€.

βœ” numbers 숫자 λ°°μ—΄μ˜ κ°€μž₯ 큰 숫자인 nκ³Ό λΉ„κ΅λŒ€μƒμ΄ 될 numbers λ°°μ—΄μ˜ 인덱슀인 kλ₯Ό λΉ„κ΅ν•˜μ—¬ n이 더 크고

βœ” stack이 λΉ„μ–΄μžˆμ§€ μ•Šκ³ 

βœ” numbersλ°°μ—΄μ˜ k번째 μˆ«μžμ™€ stack λ°°μ—΄μ˜ λ§ˆμ§€λ§‰ μˆ«μžκ°€ μΌμΉ˜ν•  λ•Œ

stack.pop()을 ν•˜κ³  result에 -λ₯Ό μ €μž₯ν•œλ‹€.

numbers λ°°μ—΄μ˜ λΉ„κ΅λŒ€μƒμ„ λ‹€μŒμœΌλ‘œ λ°”κΎΈκΈ° μœ„ν•΄ μΈλ±μŠ€κ°€ 될 k에 1을 더해쀀닀.

μœ„ 과정을 ν•΄λ‹Ή 쑰건이 λ§Œμ‘±ν• λ™μ•ˆ λ°˜λ³΅ν•΄μ€€λ‹€.

if n > k:
    print("NO")
else:
    for i in result:
        print(i)

λͺ¨λ“  과정을 마친 λ’€ numbers의 인덱슀인 kκ°€ numbers의 λ§ˆμ§€λ§‰ μΈλ±μŠ€λ³΄λ‹€ μž‘λ‹€λ©΄

λͺ¨λ“  숫자λ₯Ό 비ꡐ해보지λͺ»ν•˜κ³  λλƒˆλ‹€λŠ” λœ»μ΄λ―€λ‘œ "NO"λ₯Ό 좜λ ₯ν•˜κ³ 

μ•„λ‹ˆλΌλ©΄ result에 μ €μž₯ν•΄λ‘μ—ˆλ˜ 값을 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.

728x90

BELATED ARTICLES

more