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

 

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

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

programmers.co.kr

 

순서대로 로직을 주었으나 말이 좀 어렵게 느껴짐 + 구현하다보니 길어짐 +  내가 제대로 하고 있는건지 긴가민가.. 

3스택 쌓여서 못 풀다가 다른 블로그 글을 보았는데 웬걸 나보다 더 길어서 그냥 순서대로 '맞겠지..' 하고 풀었더니 기분좋게 통과한 문제.

util 처럼 쓴 두 함수를 소개하고, 정답 코드에 주석을 달아 두겠다.

 

1. 문자열 뒤집는 함수

func reverse(_ string: String) -> String {
    var s = string
    var result = ""
    for (i, e) in s.enumerated() {
        if "\(e)" == "(" {
            result += ")"
        } else {
            result += "("
        }
    }
    return result
}

 

2.  문자열이 올바른 쌍을 갖고 있는지 판단해줄 함수

(먼저 '(' 괄호를 열지도 않았는데 ')'가 나오면 count 는 그 즉시 음수가 된다.)

func isBalanced(_ string: String) -> Bool {
    var count = 0
    for (i, e) in string.enumerated() {
        if e == "(" { count += 1}
        else { count -= 1}
        if count < 0 { return false }
    }
    return true
    
}

 

3. 정답 + 주석

import Foundation

func reverse(_ string: String) -> String {
    var s = string
    var result = ""
    for (i, e) in s.enumerated() {
        if "\(e)" == "(" {
            result += ")"
        } else {
            result += "("
        }
    }
    return result
}

func isBalanced(_ string: String) -> Bool {
    var count = 0
    for (i, e) in string.enumerated() {
        if e == "(" { count += 1}
        else { count -= 1}
        if count < 0 { return false }
    }
    return true
    
}

func recursive(_ p: String) -> String{
    var p = p
    var u: String = ""
    var v: String = ""
    var s: [String] = []
    
    if p == "" { return "" }
    var count = 0
    for (i, e) in p.enumerated() {
        // 문자열 u, v로 분리.
        if "\(e)" == "(" {
            count += 1
            u += "("
        } else {
            u += ")"
            count -= 1
        }
        if count == 0 {
            break
        } // 이 시점에 "()" 이든 ")(" 형태이든 분리됨.
    }
    // 3에 대한 사전 준비
    v = String(p.suffix(p.count - u.count))
    
    // 3인지 4인지 판단.
    if isBalanced(u) == true { // 3-1 진입.
        return u + recursive(v)
    }
    else { // 4-1 진입. 4-1부터 4-3
        var add = "("
        add += recursive(v)
        add += ")"
        // 4-4
        u.removeFirst()
        u.removeLast()
        add += reverse(u)
        return add
    }
}

func solution(_ p:String) -> String {
    
    return recursive(p)
}
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom