본문 바로가기

알고리즘/프로그래머스

프로그래머스 - 괄호 변환

문제가 너무 길어서..

programmers.co.kr/learn/courses/30/lessons/60058?language=swift

 

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

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

programmers.co.kr

조건에 따라 계속 반복해주면 되는데

check 함수는 올바른 괄호 문자열인지 체크해주는 함수 예를들어 "()" "(())" 이렇게 정상적인 괄호

r 함수는 재귀함수로 아래의 조건을 계속 반복해주는 함수

 

1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.

2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.

3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.

3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.

4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.

4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.

4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.

4-3. ')'를 다시 붙입니다.

4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.

4-5. 생성된 문자열을 반환합니다.

 

코드 짜는거보다 저 조건 이해하는데 더 오래 시간이 걸린 것 같다 

func check(string: String) -> Bool {
    var check = ""
    for item in string.map { $0 } {
        check.append(item)
        
        if check == ")" {
            return false
        } else {
            if check.hasSuffix("()") {
                check.removeLast()
                check.removeLast()
            }
        }
    }
    
    if check == "" {
        return true
    } else {
        return false
    }
}

func r(string: String) -> String {
    var u = ""
    var v = ""
    
    if string == "" {
        return ""
    }
    
    for item in string.map { $0 } {
        let open = u.filter { $0 == "(" }
        let close = u.filter { $0 == ")" }
        
        if open.count > 0 && open.count == close.count {
            v.append(item)
        } else {
            u.append(item)
        }
    }
    
    print("u: \(u) v: \(v)")
    
    if check(string: u) {
        let result = r(string: v)
        return "\(u)\(result)"
        print("64: \(result)")
    } else {
        u.removeFirst()
        u.removeLast()
        
        var tempU = ""
        
        for item in u.map { $0 } {
            if item == "(" {
                tempU.append(")")
            } else {
                tempU.append("(")
            }
        }
        
        let tempString = "(\(r(string: v)))\(tempU)"
        
        return tempString
    }
}

func solution(_ p:String) -> String {
    var check = ""
    let map_p = p.map { $0 }
    
    for item in map_p {
        check.append(item)
        if check == ")" {
            break
        } else {
            if check.hasSuffix("()") {
                check.removeLast()
                check.removeLast()
            }
        }
    }
    
    if check == "" {
        return p
    }
    
    let result = r(string: p)
    
    return result
}