본문 바로가기

기타공부

코딩테스트 연습2020 KAKAO BLIND RECRUITMENT괄호 변환 Swift

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

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

 

코테 공부를 따로 공부하지 않습니다. 심심할때 시간때울려고 풀고있습니다. 
더 좋은 정답이 충분히 있을거라고 생각합니다.