๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
3๏ธโƒฃ Swift/Problem Solving

[Swift Algorithm] ๊ด„ํ˜ธ BOJ #9012

by seolhee2750 2021. 8. 7.
๋ฌธ์ œ ์„ค๋ช…

๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Parenthesis String, PS)์€ ๋‘ ๊ฐœ์˜ ๊ด„ํ˜ธ ๊ธฐํ˜ธ์ธ ‘(’ ์™€ ‘)’ ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ๊ทธ ์ค‘์—์„œ ๊ด„ํ˜ธ์˜ ๋ชจ์–‘์ด ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Valid PS, VPS)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•œ ์Œ์˜ ๊ด„ํ˜ธ ๊ธฐํ˜ธ๋กœ ๋œ “( )” ๋ฌธ์ž์—ด์€ ๊ธฐ๋ณธ VPS ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋งŒ์ผ x ๊ฐ€ VPS ๋ผ๋ฉด ์ด๊ฒƒ์„ ํ•˜๋‚˜์˜ ๊ด„ํ˜ธ์— ๋„ฃ์€ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด “(x)”๋„ VPS ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ VPS x ์™€ y๋ฅผ ์ ‘ํ•ฉ(concatenation)์‹œํ‚จ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด xy๋„ VPS ๊ฐ€ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด “(())()”์™€ “((()))” ๋Š” VPS ์ด์ง€๋งŒ “(()(”, “(())()))” , ๊ทธ๋ฆฌ๊ณ  “(()” ๋Š” ๋ชจ๋‘ VPS ๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด์ด๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด VPS ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ YES ์™€ NO ๋กœ ๋‚˜ํƒ€๋‚ด์–ด์•ผ ํ•œ๋‹ค. 

 

์ž…๋ ฅ

์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์€ T๊ฐœ์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์˜ ์ฒซ์งธ ์ค„์—๋Š” ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ํ•œ ์ค„์— ์ฃผ์–ด์ง„๋‹ค. ํ•˜๋‚˜์˜ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 2 ์ด์ƒ 50 ์ดํ•˜์ด๋‹ค. 

 

์ถœ๋ ฅ

์ถœ๋ ฅ์€ ํ‘œ์ค€ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŒ์ผ ์ž…๋ ฅ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด(VPS)์ด๋ฉด “YES”, ์•„๋‹ˆ๋ฉด “NO”๋ฅผ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. 

 

์ž…์ถœ๋ ฅ ์˜ˆ์ œ

์ž…๋ ฅ

6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(

์ถœ๋ ฅ

NO
NO
YES
NO
YES
NO

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
import Foundation

let count = Int(readLine()!)!

for _ in 0..<count {
    let input = readLine()!
    var stack = [Character]()
    var check = true
    
    for i in input {
        if i == "(" {
            stack.append(i)
        }
        else {
            if stack.isEmpty { check = false; break }
            else { stack.removeLast() }
        }
    }
    
    if check == false { print("NO") }
    else {
        if !stack.isEmpty { print("NO") }
        else { print("YES") }
    }
}

์ด ๋ฌธ์ œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ œ์™€ ์•„์ฃผ ์œ ์‚ฌํ•˜๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ œ์—์„œ๋Š” ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  +, - ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด ์‰ฝ๊ฒŒ ํ’€์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์Šคํƒ์„ ์ด์šฉํ•˜์—ฌ ๋‹ค๋ฅด๊ฒŒ ํ’€์ดํ•ด๋ณด์•˜๋‹ค.

  • "("๊ฐ€ ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€, ")"๊ฐ€ ์ž…๋ ฅ๋˜์—ˆ๋Š”์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์กฐ๊ฑด๋ฌธ์„ ์ž‘์„ฑํ–ˆ๋‹ค.
  • "("๊ฐ€ ์ž…๋ ฅ๋˜์—ˆ์„ ๋•Œ๋Š” ํ›„์— )๊ฐ€ ์˜ฌ์ง€, ์•„๋‹์ง€ ์•„์ง ๋ชจ๋ฅด๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ, stack์— ์ถ”๊ฐ€๋งŒ ํ•ด์ค€๋‹ค.
  • ")" ์ž…๋ ฅ์‹œ์—๋Š” ์ด์ „์— ๋งž๋Š” "("์Œ์ด ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ์ฒดํฌํ•ด์ค˜์•ผํ•œ๋‹ค. 
    ์ด ๋•Œ, ์Šคํƒ์ด ๋น„์—ˆ๋‹ค๋ฉด ์˜ณ์ง€ ์•Š์€ ๋ฌธ์žฅ์ด ๋˜๋ฏ€๋กœ check๋ฅผ false๋กœ ๋ฐ”๊ฟ”์ค€ ํ›„ ๋ฐ”๋กœ breakํ•ด์ค€๋‹ค.
    ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด, ๊ตณ์ด ")"๋Š” ์ถ”๊ฐ€ํ•ด์ฃผ์ง€ ์•Š๊ณ ,stack์˜ ๋งˆ์ง€๋ง‰ "("๋ฅผ ์‚ญ์ œํ•ด์ค€๋‹ค.
    ("("๊ณผ ")"์ด ์•Œ๋งž๊ฒŒ ๋งŒ๋‚ฌ๋‹ค๋ฉด ์˜ฌ๋ฐ”๋ฅธ ์Œ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ตณ์ด ์Šคํƒ์ด ๋‘˜ ํ•„์š”์—†์ด ์ œ๊ฑฐํ•ด์ค€๋‹ค.)
  • ์œ„์™€ ๊ฐ™์ด ๋ชจ๋“  ๊ด„ํ˜ธ๋ฅผ ๊ฒ€์‚ฌํ•ด์ค€ ๋’ค, check๊ฐ€ false๋กœ ๋ฐ”๋€Œ์–ด์žˆ๋‹ค๋ฉด ๋ฐ”๋กœ "NO"๋ฅผ ์ถœ๋ ฅํ•˜๊ณ ,
    ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์Šคํƒ์ด ๋น„์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด์ค€๋‹ค.
    ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€์•Š๋‹ค๋ฉด ์˜ฌ๋ฐ”๋ฅธ ์Œ์ด ๋˜์ง€ ๋ชปํ•ด ์Šคํƒ์— ๋‚จ์€ ๊ด„ํ˜ธ๊ฐ€ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ,
    "NO"๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด "YES"๋ฅผ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์Šคํƒ์€ ๊ฐœ๋…์€ ์ •๋ง ์‰ฝ๊ฒŒ ๋Š๊ปด์ง€์ง€๋งŒ,
    ๋ง‰์ƒ ํ’€์ดํ• ๋•Œ๋Š” ๋ณต์žกํ•˜๊ณ  ์ƒ๊ฐ๋ณด๋‹ค ์˜ˆ์™ธ๊ฐ€ ๋งŽ์•„ ํ‘ธ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฝค ๊ฑธ๋ฆฐ๋‹ค.
  • ๊ทธ๋ž˜๋„ ๋งŽ์ด ํ’€๋‹ค๋ณด๋‹ˆ ์ ์  ์ต์ˆ™ํ•ด์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ,, ๊ณ„์† ๋ณต์Šตํ•ด์•ผ๊ฒ ๋‹ค.

 


 

๋ฌธ์ œ

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

๋Œ“๊ธ€