๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/swift

[Swift] ๋ฐฑ์ค€ 9012๋ฒˆ - ๊ด„ํ˜ธ

by hyebin (Helia) 2023. 3. 18.
๋ฐ˜์‘ํ˜•
๋ฐฑ์ค€ ๋ฌธ์ œ ๋ชจ์Œ

๋ฌธ์ œ ๋งํฌ

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

 

9012๋ฒˆ: ๊ด„ํ˜ธ

๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Parenthesis String, PS)์€ ๋‘ ๊ฐœ์˜ ๊ด„ํ˜ธ ๊ธฐํ˜ธ์ธ ‘(’ ์™€ ‘)’ ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ๊ทธ ์ค‘์—์„œ ๊ด„ํ˜ธ์˜ ๋ชจ์–‘์ด ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Valid PS, VPS)์ด๋ผ๊ณ 

www.acmicpc.net

 

๋ฌธ์ œ

๊ด„ํ˜ธ ๋ฌธ์ž์—ด(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”๋ฅผ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. 

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

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜

  • ์ž๋ฃŒ ๊ตฌ์กฐ
  • ๋ฌธ์ž์—ด
  • ์Šคํƒ

๋ฌธ์ œ ํ’€์ด

  • ์ •์ˆ˜ T๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ T๋งŒํผ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • input์— ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›๊ณ , stack์€ Characterํ˜• ๋ฐฐ์—ด๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. flag๋„ true๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • input์˜ ์š”์†Œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๊บผ๋‚ด s์— ๋Œ€์ž…ํ•˜๊ณ , for๋ฌธ์˜ ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•œ๋‹ค.
    • ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์—์„œ "(" ์ด๋ฉด stack์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ")"์ธ ๊ฒฝ์šฐ, stack์ด ๋น„์–ด์žˆ์œผ๋ฉด flag๋ฅผ false๋กœ ๋ฐ”๊พผ ํ›„ for๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค. ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด stack์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
    • for๋ฌธ์ด ์ข…๋ฃŒ๋˜๊ณ , stack์ด ๋น„์–ด์žˆ๊ณ  flag๊ฐ€ true๋ผ๋ฉด "Yes"๋ฅผ, ์•„๋‹ˆ๋ผ๋ฉด "No"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์†Œ์Šค์ฝ”๋“œ

for _ in 0..<Int(readLine()!)! {
    let input = readLine()!
    var stack = [Character]()
    var flag = true

    for s in input{
        if s == "(" {
            stack.append("(")
        }
        else {
            if stack.isEmpty {
                flag = false
                break
            }
            stack.removeLast()
        }
    }
    stack.isEmpty && flag ? print("YES") : print("NO")
}
  • 8ms ์†Œ์š”

๋‹ค๋ฅธ ์ฝ”๋“œ

func isValidPS(_ str: String) -> Bool {
    var standard = 0
    for char in str {
        if char == "(" {
            standard += 1
        } else if char == ")" {
            standard -= 1
        }
           
        if standard < 0 {
            return false
        }
    }
    return standard == 0
}

if let inputNumber = Int(readLine() ?? "") {
    for _ in 0..<inputNumber {
        print(isValidPS(readLine() ?? "") ? "YES" : "NO")
    }
}
  • "(" ์ผ ๋•Œ ๋ณ€์ˆ˜ standard์— 1์„ ๋”ํ•˜๊ณ , ")"์ผ ๋•Œ 1์„ ๋บ€๋‹ค.
  • standard๊ฐ€ 0๋ณด๋‹ค ์ž‘์•„์ง€๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • 8ms ์†Œ์š”
๋ฐ˜์‘ํ˜•