문제
풀이 코드
// [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 이기 때문에 스택을 이용하여 풀이를 해보았다