본문 바로가기
Algorithm/문제풀이_프로그래머스

[Swift][프로그래머스][브루트포스] 괄호 변환

by Joahnee 2022. 5. 3.

요구능력

재귀함수에 대한 이해

 

문제풀이

이 문제는 쪼개서 이해하면 이해가 잘되고 풀리게된다.

문제에서 주어진 절차를 무시할경우 삽질하게 되니 주의..

 

1) 균형잡힌 괄호문자열 u와 v로 분류

균형잡힌 괄호문자열을 u와 v로 분류해준다.

"("괄호의 개수는 leftCount, ")"괄호의 개수는 rightCount로 계산해주었다.

leftCount와 rightCount가 같아지면 그건 균형잡힌 괄호문자열이 된다.

func seperate(_ p: String) -> (String, String){
        var leftCount = 0
        var rightCount = 0
        let pArr = Array(p)
        var u = ""
        var v = ""
        for i in 0..<pArr.count{
            if pArr[i] == "("{
                leftCount += 1
            }else{
                rightCount += 1
            }
            if leftCount == rightCount{
                u = String(pArr[0...i])
                v = String(pArr[i+1..<p.count])
                break
            }
        }
        return (u, v)
    }

 

2) 올바른 괄호문자열인지의 판별

나는 스택을 이용해서 "("인 경우에는 넣어주고 ")"인 경우에는 스택에서 "("를 제거해주는데, 스택이 비어있는데 ")"라면 올바른 괄호문자열이 아니므로 false를 리턴해준다.

func isCorrect(_ p: String) -> Bool{
        var arr = [String]()
        for i in p{
            if i == "("{
                arr.append("(")
            }else{
                if arr.count == 0{
                    return false
                }else{
                    arr.removeLast()
                }
            }
        }
        return true
    }

 

3) 문제에 적힌 그대로 재귀를 해준다.

func recursive(_ p: String) -> String{
        var result = ""
        if p.count == 0 {return ""}
        var (u,v) = seperate(p)
        let uArr = Array(u)
        var temp = ""
        if isCorrect(u){
            result = u + recursive(v)
        }else{
            temp += "("
            temp += recursive(v)
            temp += ")"
            
            u = String(uArr[1..<uArr.count-1])
            for i in u{
                if i == "("{
                    temp += ")"
                }else{
                    temp += "("
                }
            }
            result = temp
        }
        
        return result
    }

 

후기

복잡하고 문제이해가 힘들었던 문제

코드

func solution(_ p:String) -> String {
    func isCorrect(_ p: String) -> Bool{
        var arr = [String]()
        for i in p{
            if i == "("{
                arr.append("(")
            }else{
                if arr.count == 0{
                    return false
                }else{
                    arr.removeLast()
                }
            }
        }
        return true
    }
    func seperate(_ p: String) -> (String, String){
        var leftCount = 0
        var rightCount = 0
        let pArr = Array(p)
        var u = ""
        var v = ""
        for i in 0..<pArr.count{
            if pArr[i] == "("{
                leftCount += 1
            }else{
                rightCount += 1
            }
            if leftCount == rightCount{
                u = String(pArr[0...i])
                v = String(pArr[i+1..<p.count])
                break
            }
        }
        return (u, v)
    }
    func recursive(_ p: String) -> String{
        var result = ""
        if p.count == 0 {return ""}
        var (u,v) = seperate(p)
        let uArr = Array(u)
        var temp = ""
        if isCorrect(u){
            result = u + recursive(v)
        }else{
            temp += "("
            temp += recursive(v)
            temp += ")"
            
            u = String(uArr[1..<uArr.count-1])
            for i in u{
                if i == "("{
                    temp += ")"
                }else{
                    temp += "("
                }
            }
            result = temp
        }
        
        return result
    }
    
    var answer = ""
    if isCorrect(p){
        return p
    }
    answer = recursive(p)
    return answer
}

 

댓글