import UIKit
func solution(_ p:String) -> String {
return finalFunction(p: p)
}
func makeUV(item :String) -> (String , String) {
var count1 : Int = 0
var count2 : Int = 0
//균형잡힌 괄호 문자열 을 찾기 위해 앞에서 부터 ( 수를 찾음
for char in item {
if(char == "("){
count1 += 1
}else{
count2 += 1
}
// (의 수와 ) 수가 같다면 균형잡힌 괄호 문자열이기에 for 문을 멈추고
// U , V 를 배출
if(count1 == count2){
break
}
}
//앞에서 부터 ( 의갯수 와 ) 의 갯수 에서 index 개념이기에 - 1
//시작이 0이라서
// U , V 배출
return (item.substring(from: 0 , to: count1 + count2 - 1) , item.substring(from: count1 + count2 , to: item.count - 1))
}
//U 가 올바른 괄호 문자열 인지 체크
func checkingGoodU(item : String) -> Bool{
var openCount : Int = 0
var checking : Bool = true
//열린 괄호의 갯수를 파악
for char in item{
if(char == "("){
openCount += 1
}else{
openCount -= 1
//열린 괄호의 갯수보다 닫힌 괄호의 갯수가 더많다면 false
if(openCount < 0){
checking = false
break
}
}
}
//열린 만큼 안닫혀있기때문에 false
if(openCount != 0){
checking = false
}
return checking
}
func finalFunction(p : String) -> String{
//빈값이였을경우 리턴
if(p.isEmpty) {
return ""
}else{
//받은 텍스트를 UV로 나누고
let item = makeUV(item: p)
//U가 올바른 괄호 문자열 체크
if(checkingGoodU(item: item.0)){
//올바른 괄호 문자열일결우 V에 대해 처음 부터 다시시작
return item.0 + finalFunction(p : item.1)
}else{
//아닐 경우
//조건에 맞춰 처리
var temp : [String] = item.0.map{ String($0) }
temp.removeFirst()
temp.removeLast()
temp = temp.map { char in
if( char == "(" ){
return ")"
}else{
return "("
}
}
return "(" + item.1 + ")" + temp.joined()
}
}
}
//Swift에 따로 substring 이 없기떄문에 substring 을 따로 구현
extension String {
func substring(from: Int, to: Int) -> String {
guard from < count , to >= 0, to - from >= 0 else {
return ""
}
// Index 값 획득
let startIndex = index(self.startIndex, offsetBy: from)
let endIndex = index(self.startIndex, offsetBy: to + 1) // '+1'이 있는 이유: endIndex는 문자열의 마지막 그 다음을 가리키기 때문
// 파싱
return String(self[startIndex ..< endIndex])
}
}
print(solution("))((((())((()"))
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/60058
코테 공부를 따로 공부하지 않습니다. 심심할때 시간때울려고 풀고있습니다.
더 좋은 정답이 충분히 있을거라고 생각합니다.
'기타공부' 카테고리의 다른 글
코딩테스트 연습 2020 KAKAO BLIND RECRUITMENT 문자열 압축 Swift (0) | 2021.12.04 |
---|---|
코딩테스트 - 해시 - 위장 Swift (0) | 2021.11.30 |
2018 KAKAO BLIND RECRUITMENT 파일명 정렬 Swift (0) | 2021.11.30 |