문제

 

풀이 코드

// [BOJ] 9012 - 괄호
public struct Stack<T> {
    private var elements = [T]()
    public init() {}
    
    public mutating func pop() -> T? {
        return self.elements.popLast()
    }
    
    public mutating func push(_ element: T) {
        self.elements.append(element)
    }
    
    public var empty: Bool {
        return self.elements.isEmpty
    }
}

let T = Int(readLine()!)!

for _ in 0..<T {
    let ps = readLine()!
    var psStack = Stack<Character>()
    var result = "YES"
    
    for item in ps {
        if item == "(" { psStack.push(item) }
        else {
            if psStack.empty { result = "NO";break }
            else { psStack.pop() }
        }
    }
    if !psStack.empty { result = "NO" }
    print(result)
}

 

풀이 과정

Stack 을 이용하여 문제를 풀어보았다.

전체적인 프로세스는 다음과 같다.

 

1. "(" 문자가 들어올때 스택에 저장한다.

2. ")" 문자가 들어올때 두가지 경우로 판단한다

   2-1. 현재 스택이 비어있다면 괄호의 쌍이 맞지 않기 때문에 NO 를 저장
   2-2 현재 스택에 데이터[ "(" ] 가 있는 상태면 한 쌍이 되니 pop 을 이용해 데이터를 스택에서 제거한다

3. 2번과정이 전부 돌아 간후, stack 내부에 데이터가 있다면 쌍이 맞지않는 [ "(" ] 가 있는것이기 때문에 NO 를 출력한다.

4. 3번 과정까지 NO 가 아니라면 쌍이 맞는 괄호이므로 YES 가 출력된다.

 

이렇게 스택을 이용하여 풀이를 하였지만,

아무래도 가독성이 너무 떨어지는것 같다.

 

사실 처음에는 단순히 +1 . -1 해서 판단 하려 했으나, 이번주 알고리즘 스터디 내용이 Stack 이기 때문에 스택을 이용하여 풀이를 해보았다

+ Recent posts