import Foundation
func solution(_ p:String) -> String {
let pArr = p.map { String($0) }
return recursive(pArr)
}
// 올바른 괄호 문자열로 만들어주는 재귀 메서드
func recursive(_ pArr: [String]) -> String {
var u: [String] = [] // 균형잡힌 괄호 문자열
var v = ""
var openCount = 0
for (index, p) in pArr.enumerated() {
u.append(p)
if p == "(" {
openCount += 1
} else {
openCount -= 1
}
if openCount == 0 { // 균형잡힌 괄호가 완성됐다면 탈출
if pArr.count > index + 1 {
v = recursive(Array(pArr[(index + 1)...]))
}
break
}
}
if u.count == 0 {
return v
} else if u[0] == ")" { // 의미를 알 수 없는 지문의 '4번째 기능' 수행
return "(" // 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.
+ v // 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.
+ ")" // 4-3. ')'를 다시 붙입니다.
+ reverse(u)
} else {
return u.reduce("") { $0 + $1 } + v
}
}
func reverse(_ pArr: [String]) -> String {
let array = pArr[1..<(pArr.count - 1)]
var output = ""
if array.count == 0 {
return output
} else {
for p in array {
if p == "(" {
output += ")"
} else {
output += "("
}
}
}
return output
}
문제 지문이 쓰레기 좀 구려서 애먹었던 문제.
괄호 이쁘게 맞추는 단순한 문제인데 지문에 나온 괴상한 로직을 무조건 따라해야한다.
문제는 지문의 로직이 대부분 생각하지 못하는 괴상한 로직이라는 것.
지문 꼼꼼히 안 읽으면 백퍼 실패한다.