🌞Algorithm/πŸ”₯Baekjoon

[Baekjoon] 1874_μŠ€νƒ μˆ˜μ—΄

λΏŒμ•Ό._. 2021. 10. 1. 15:16

Silver III

문제(좜처: https://www.acmicpc.net/problem/1874)

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

문제 

 

μŠ€νƒ (stack)은 기본적인 자료ꡬ쑰 쀑 ν•˜λ‚˜λ‘œ, 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ 자주 μ΄μš©λ˜λŠ” κ°œλ…μ΄λ‹€.
μŠ€νƒμ€ 자료λ₯Ό λ„£λŠ” (push) μž…κ΅¬μ™€ 자료λ₯Ό λ½‘λŠ” (pop) μž…κ΅¬κ°€ κ°™μ•„ 제일 λ‚˜μ€‘μ— λ“€μ–΄κ°„ μžλ£Œκ°€ 제일 λ¨Όμ € λ‚˜μ˜€λŠ”
(LIFO, Last in First out) νŠΉμ„±μ„ κ°€μ§€κ³  μžˆλ‹€.
1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό μŠ€νƒμ— λ„£μ—ˆλ‹€κ°€ 뽑아 λŠ˜μ–΄λ†“μŒμœΌλ‘œμ¨, ν•˜λ‚˜μ˜ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€. μ΄λ•Œ, μŠ€νƒμ— push ν•˜λŠ”
μˆœμ„œλŠ” λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμ„ 지킀도둝 ν•œλ‹€κ³  ν•˜μž.
μž„μ˜μ˜ μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μŠ€νƒμ„ μ΄μš©ν•΄ κ·Έ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€, μžˆλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ
push와 pop 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€. 이λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

 

μž…λ ₯

 

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

 

좜λ ₯ 

 

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

 

 

문제 풀이

   - my solution

import sys

if __name__=='__main__':
    n=int(sys.stdin.readline().strip())

    arr=[]
    for i in range(n): #μˆ˜μ—΄ μž…λ ₯
        arr.append(int(sys.stdin.readline().strip()))

    idx=0
    idx_stack=1
    temp=[] #μ˜€λ¦„μ°¨μˆœ push
    answer=[] # +,-
    result=[] # λ§Œλ“€μ–΄μ§„ μˆ˜μ—΄
    while True:
        if idx>=n or idx_stack>n+1: #μ’…λ£Œ 쑰건
            break
        if len(temp)!=0 and temp[-1]==arr[idx]: #temp에 이미 μžˆλŠ” κ°’ pop
            result.append(temp.pop())
            answer.append("-")
            idx+=1
        elif arr[idx]!=idx_stack: # push
            temp.append(idx_stack)
            idx_stack+=1
            answer.append("+")
        elif arr[idx]==idx_stack: # λ„£μœΌλ €λŠ” 값이 ν•„μš”ν•œ 값이면
            result.append(idx_stack) # push 전에 λ°”λ‘œ result에 μΆ”κ°€
            answer.append("+") # puxh
            answer.append("-") # pop
            idx_stack+=1
            idx+=1

    if arr==result: # λ§Œλ“€μ–΄μ§„ μˆ˜μ—΄μ΄ μž…λ ₯ μˆ˜μ—΄κ³Ό κ°™μœΌλ©΄
        for i in answer:
            print(i)
    else: # λΆˆκ°€λŠ₯ν•œ 경우
        print("NO")

 

μ˜ˆμ „λΆ€ν„° 문제만 보고 이해λ₯Ό λͺ»ν•΄μ„œ ν¬κΈ°ν–ˆλ˜ λ¬Έμ œμ΄λ‹€.

μ°¨κ·Όμ°¨κ·Ό μ‚΄νŽ΄λ³΄λ‹ˆ 생각보닀 문제λ₯Ό μ΄ν•΄ν•˜κΈ° 쉬웠닀.

 

1) nμž…λ ₯, λ§Œλ“€ μˆ˜μ—΄ μž…λ ₯_arr

2) while문을 μ‚¬μš©ν•˜μ—¬ μˆ˜μ—΄ λ§Œλ“€κΈ°

  2-1) μ’…λ£Œ 쑰건) arr의 indexλ₯Ό λ„˜κ±°λ‚˜ n+1보닀 큰 경우

  2-2) temp에 이미 μžˆλŠ” 값이면 pop

  2-3) idx_stack이 ν•„μš”ν•œ 값이 μ•„λ‹ˆλ©΄
  2-4) idx_stack이 μˆ˜μ—΄μ— ν•„μš”ν•œ 값이면 push

3) λ§Œλ“€μ–΄μ§„ μˆ˜μ—΄μ΄ μž…λ ₯ μˆ˜μ—΄κ³Ό κ°™μœΌλ©΄ 좜λ ₯, κ°™μ§€ μ•ŠμœΌλ©΄ 'NO' 좜λ ₯


μƒκ°πŸ€”

 

λͺ‡ λ²ˆμ΄λ‚˜ μ§€λ‚˜μΉœ 문제 μΉ˜κ³ λŠ” 생각보닀 빨리 ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€.

문제 이해λ₯Ό λͺ»ν–ˆλ˜ 것이 μ»Έλ˜ 것 κ°™λ‹€. 문제λ₯Ό μ΄ν•΄ν•˜κ³  λ‚˜μ„œλŠ” 금방 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆμ—ˆλ‹€.

νŒŒμ΄μ¬μ—μ„œλŠ” listλ₯Ό ν™œμš©ν•˜μ—¬ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€.

 

λ‚΄κ°€ μƒκ°ν•˜κΈ°μ— 이 문제의 ν¬μΈνŠΈλŠ”

1) 문제 이해!!! κ°€ κ°€μž₯ 크고

2) 파이썬_ list의 ν™œμš©, 쑰건문 μ‚¬μš©

μ΄μ—ˆλ˜ 것 κ°™λ‹€.