해당 문제는 순서가 존재하는 (여는 괄호 먼저, 닫는 괄호 나중에) 쌍을 매칭시켜서 순서와 갯수를 모두 확인하는 문제입니다.
이런 문제는 stack을 활용해서 먼저 오는 괄호를 push, 나중에 오는 괄호를 pop하는 방식을 통해서 순서와 갯수가 맞는지 모두 확인할 수 있습니다.
//✅ valid한 괄호문자인지 확인하는 함수
func isVPS(_ ps: String) -> Bool {
var stack = [Int]() //👉 array로 stack을 구현
let psArray = ps.map { String($0) } //👉 char 하나하나를 String으로 바꾸어 준다.
// 각 괄호를 순환하면서
for p in psArray {
if p == "(" { //👉 여는 괄호일 때 stack에 push한다.
stack.append(0)
} else { //👉 닫는 괄호일 때
if !stack.isEmpty {
stack.popLast() //👉 stack이 비어있지 않다면 pop (닫는 괄호가 더 많음)
} else {
return false //👉 stack이 비어있다면 valid하지 않으므로 false를 리턴
}
}
}
// 각 괄호를 모두 순환한 이후에
if !stack.isEmpty { //👉 stack이 비어있지 않다면 (여는 괄호가 더 많음) false를 리턴
return false
} else { // 👉 stack이 비어 있다면 true를 리턴
return true
}
}
let T = Int(readLine()!)!
for _ in 0..<T {
let ps = readLine()!
print(isVPS(ps) ? "YES" : "NO")
}