λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[Swift] λ°±μ€€ 1874번 - μŠ€νƒ μˆ˜μ—΄

by hyebin (Helia) 2023. 3. 29.
λ°˜μ‘ν˜•
λ°±μ€€ 문제 λͺ¨μŒ

문제 링크

https://www.acmicpc.net/problem/1874

 

1874번: μŠ€νƒ μˆ˜μ—΄

1λΆ€ν„° nκΉŒμ§€μ— μˆ˜μ— λŒ€ν•΄ μ°¨λ‘€λ‘œ [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 μˆ˜ν–‰ν•˜λ©΄ μˆ˜μ—΄ [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 μžˆλ‹€.

www.acmicpc.net

 

문제

μŠ€νƒ (stack)은 κΈ°λ³Έμ μΈ μžλ£Œκ΅¬μ‘° μ€‘ ν•˜λ‚˜λ‘œ, μ»΄ν“¨ν„° ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ μžμ£Ό μ΄μš©λ˜λŠ” κ°œλ…μ΄λ‹€. μŠ€νƒμ€ μžλ£Œλ₯Ό λ„£λŠ” (push) μž…ꡬ와 μžλ£Œλ₯Ό λ½‘λŠ” (pop) μž…ꡬ가 κ°™μ•„ μ œμΌ λ‚˜μ€‘에 λ“€μ–΄κ°„ μžλ£Œκ°€ μ œμΌ λ¨Όμ € λ‚˜μ˜€λŠ” (LIFO, Last in First out) νŠΉμ„±μ„ κ°€μ§€κ³  μžˆλ‹€.

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

μž…λ ₯

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

좜λ ₯

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

μž…μΆœλ ₯ μ˜ˆμ‹œ

μ•Œκ³ λ¦¬μ¦˜ λΆ„λ₯˜

  • 자료 ꡬ쑰
  • μŠ€νƒ

문제 풀이

  • ν˜„μž¬μ˜ μ •μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ λ³€μˆ˜ currentλ₯Ό 1둜 μ΄ˆκΈ°ν™”ν•˜μ—¬ μ„ μ–Έν•œλ‹€.
  • currentλ₯Ό μž…λ ₯받은 μ •μˆ˜ numκΉŒμ§€ 1μ”© μ¦κ°€μ‹œν‚€λ©΄μ„œ stack에 μΆ”κ°€ν•œ ν›„ result λ³€μˆ˜μ— +λ₯Ό μΆ”κ°€ν•œλ‹€.
  • stack의 λ§ˆμ§€λ§‰ μš”μ†Œκ°€ numκ³Ό κ°™λ‹€λ©΄ stack의 λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό μ‚­μ œν•œ ν›„ result λ³€μˆ˜μ— -λ₯Ό μΆ”κ°€ν•œλ‹€.
  • stack이 λΉ„μ–΄μžˆλ‹€λ©΄ resultλ₯Ό 좜λ ₯ν•˜κ³ , μ•„λ‹ˆλΌλ©΄ λΆˆκ°€λŠ₯ν•œ 경우이기 λ•Œλ¬Έμ— "No"λ₯Ό 좜λ ₯ν•œλ‹€.

μ†ŒμŠ€μ½”λ“œ

let n = Int(readLine()!)!
var result = "", current = 1
var stack = [Int]()

for _ in 0..<n {
    let num = Int(readLine()!)!
    while current <= num {
        stack.append(current)
        result += "+\n"
        current += 1
    }
    
    if stack.last! == num {
        stack.removeLast()
        result += "-\n"
    }
}

stack.isEmpty ? print(result) : print("NO")
  • 88ms μ†Œμš”
λ°˜μ‘ν˜•