https://school.programmers.co.kr/learn/courses/30/lessons/60058
문자열 + 재귀 + 구현 문제. 오랜만에 알고리즘을 푼지라 시간이 많이 걸렸다. 주의할점은 괄호를 변경할 때 문자열을 뒤집는게 아닌 괄호를 뒤집어야 한다. ( 를 )로 뒤집는 것. 문자열과 재귀, 구현을 어느 정도 이해하고 있으면 그리 어려운 문제는 아닌듯 하다.
import Foundation
func checkIsBalance(_ p: String) -> Bool {
let strArr = Array(p)
var startCount: Int = 0
var endCount: Int = 0
for str in strArr {
if str == "(" {
startCount += 1
} else {
endCount += 1
}
}
return startCount == endCount
}
func splitBalanceStr(_ p: String) -> (String, String) {
var startCount: Int = 0
var endCount: Int = 0
var point = 0
for str in Array(p) {
if str == "(" {
startCount += 1
} else {
endCount += 1
}
if startCount == endCount {
break
}
point += 1
}
let uIndex = p.index(p.startIndex, offsetBy: point)
let u = String(p[p.startIndex...uIndex])
if point == p.count-1 {
return (u, "")
}
let vIndex = p.index(p.startIndex, offsetBy: point+1)
let endIndex = p.index(p.endIndex, offsetBy: -1)
let v = String(p[vIndex...endIndex])
return (u, v)
}
func checkIsRightStr(_ str: String) -> Bool {
var stack: [String] = []
let strArr = Array(str).map{ String($0) }
stack.append(strArr[0])
for i in 1..<strArr.count {
let currentStr = strArr[i]
if currentStr == "(" {
stack.append("(")
} else {
if !stack.isEmpty {
let last = stack.last!
if last == "(" {
stack.removeLast()
} else {
return false
}
} else {
return false
}
}
}
return stack.isEmpty
}
func reversedStr(_ p: String) -> String {
var result = ""
for str in Array(p) {
if str == "(" {
result.append(")")
} else {
result.append("(")
}
}
return result
}
func solution(_ p:String) -> String {
var answer = ""
let pArr = Array(p)
if p.count == 0 {
return ""
}
if checkIsRightStr(p) {
return p
}
//문자열 분리
let splitStr = splitBalanceStr(p)
let u = splitStr.0
let v = splitStr.1
//분리한 문자열 u가 완전한 문자열인지 체크
if checkIsRightStr(u) {
answer = u+solution(v)
} else {
answer += "("
answer += solution(v)
answer += ")"
var removedU = u
removedU.removeFirst()
removedU.removeLast()
answer += reversedStr(removedU)
}
return answer
}
'Algorithm > 프로그래머스' 카테고리의 다른 글
Swift) 프로그래머스 - 전력망을 둘로 나누기 - lv2 (0) | 2023.07.31 |
---|---|
Swift) 2020 카카오 인턴십 - 수식 최대화 (0) | 2023.07.27 |
Swift) 2018 KAKAO BLIND RECRUITMENT - 프렌즈 4블록 (0) | 2023.06.23 |
Swift) 2018 KAKAO BLIND RECRUITMENT - 뉴스 클러스터링 (0) | 2023.06.18 |
프로그래머스 : 프린터(Swift) (0) | 2021.09.15 |