나의 기록, 현진록

[Swift] 프로그래머스 코딩테스트 연습>괄호 변환 본문

Programming/Algorithm & Data Structure

[Swift] 프로그래머스 코딩테스트 연습>괄호 변환

guswlsdk 2022. 5. 31. 14:03
반응형

 

 

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

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

programmers.co.kr

 

 

문제풀이

정신차리고 문제만 제대로 보고 그대로 코딩하면 된다. 문제 보고 그대로 코딩해라.....

 

출력 결과는 제대로 나오나 제출 시 통과하지 못하였는데 문제가 되는 부분은 다음과 같다.

return "("+recursion(v)+")"+u.joined()

 

 

 

 

위와 같이 해야 하는데

return "("+u.joined()+")"+recursion(v)

이처럼 하였다. 출력 결과는 문제 없는 것 같은데 결과적으로 문제를 제대로 보고 그대로 코딩하면 된다...

만약 문제에서 알고리즘이 설명되어 있지 않다면 절대 못 풀었을지도.....?

코드

import Foundation
print(solution("(()())()"))
print(solution(")("))
print(solution("()))((()"))
print(solution("))(()("))
func solution(_ p:String) -> String {
    func recursion(_ pA: [String]) -> String{
        if pA.isEmpty{
            return ""
        }
        if rightStr(pA){
            return pA.joined(separator: "")
        }
        
        var u = balanceStr(pA)
        var v = [String]()
        if pA.count != u.count{
            v = [String](pA[u.count...pA.endIndex-1])
        }
        if rightStr(u){
            return u.joined(separator: "") + recursion(v)
        }else{
            u.removeFirst()
            u.removeLast()
            for i in 0..<u.count{
                if u[i] == "("{
                    u[i] = ")"
                }else{
                    u[i] = "("
                }
            }
            return "("+recursion(v)+")"+u.joined()
        }
    }
    
    func balanceStr(_ pA: [String]) -> [String]{
        var index = 0
        var left = 0
        var right = 0
        repeat{
            if pA[index] == "("{
                left += 1
            }else{
                right += 1
            }
            index += 1
        }while(left != right && index < pA.count)
        return [String](pA[0...index-1])
    }
    
    func rightStr(_ pA: [String]) -> Bool{
        var stack = [String]()
        var top = -1
        stack.append(pA.first!)
        top += 1
        for i in 1..<pA.count{
            if top < 0{
                stack.append(pA[i])
                top += 1
            }else{
                if stack[top] == "(" && pA[i] == ")"{
                    stack.removeLast()
                    top -= 1
                }else{
                    stack.append(pA[i])
                    top += 1
                }
            }
        }
        return top == -1 ? true : false
    }
    let pArr = p.map{String($0)}
    return recursion(pArr)
}
반응형