기본적인 stack 문제로 여는 괄호와 닫는 괄호를 짝짓는 문제입니다. 이 포스팅을 참고해주세요.
다만 이 경우의 경우 괄호가 소괄호와 대괄호로 두 가지입니다. 닫는 괄호가 나왔을 때 stack에서 pop한 여는 괄호가 닫는 괄호와 같은 종류의 괄호인지 확인합니다.
// 계속 입력을 받아야 하므로 while true
while true {
let input = readLine()!
// 입력 종료 조건
if input == "." { break }
// 괄호를 넣기 위한 stack
var stack = [Character]()
// 균형 잡힌 문자열인지 저장하는 Bool 변수
var isBalanced = true
// 각각 문자열을 확인하면서 괄호만 체크
for char in input {
// 여는 괄호인 경우 stack에 저장
if char == "(" || char == "[" {
stack.append(char)
} else if char == ")" { //👉 닫는 소괄호인 경우에 stack에서 pop한 것이 여는 소괄호인지 확인
guard let popped = stack.popLast() else { isBalanced = false; break }
if popped != "(" { isBalanced = false; break }
} else if char == "]" { //👉 닫는 대괄호인 경우 stack에서 pop한 겅이 여는 대괄호인지 확인
guard let popped = stack.popLast() else { isBalanced = false; break }
if popped != "[" { isBalanced = false; break }
}
}
//⭐️ stack에 괄호가 남아 있으면 false
if !stack.isEmpty { isBalanced = false }
print(isBalanced ? "yes" : "no")
}