본문 바로가기
알고리즘 문제풀이

[프로그래머스] 괄호 변환 (Swift)

by SiO2whocode 2022. 3. 24.
728x90

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

 

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

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

programmers.co.kr

문제대로 착실히 재귀함수를 구현해도 잘 풀리는 문제..

그래서 2번인듯

 

접근방법

이 문제는 정말 접근방법을 문제에서 다 준 경우..

 

문제는 문자열 u가 올바른 괄호문자열인지 판단하는 함수를 만들었었는데

다른분 풀이보고 그냥 첫번째 문자만 열린괄호인지 확인하면 된다는 것을 깨닫고..

차마 이전 코드를 지우지 못해 주석 처리해둔..(이런거 안좋다그랬는데 클린코드가..아까운데 어떡해)

아무튼 머리 별로 안써서 좋았다 ㅎ

 

 

소스코드

import Foundation

func solution(_ p:String) -> String {
    return makeCorrectStr(Array(p))
}

func makeCorrectStr(_ w:[Character]) -> String {
    if w.count == 0 {
        return String(w)
    }
    
    let divided:(u:[Character], v:[Character]) = divide(w)
    var u:[Character] = divided.u
    let v:[Character] = divided.v
    
    if isCorrect(u) {
        return String(u) + makeCorrectStr(v)
    } else {
        u.removeFirst()
        u.removeLast()
        return "(" + makeCorrectStr(v) + ")" + String(u.map{ $0 == "(" ? ")" : "("})
    }
}

func divide(_ w:[Character]) -> ([Character], [Character]) {
    var openCnt:Int = 0
    var closeCnt:Int = 0
    for (i, ch) in w.enumerated() {
        if ch == "(" {
            openCnt += 1
        } else {
            closeCnt += 1
        }
        if openCnt == closeCnt {
            let u = w[...i]
            let v = w[(i+1)...]
            return (Array(u),Array(v))
        }
    }
    return ([],[])
}

func isCorrect(_ u:[Character]) -> Bool {
    return u.first == "("
//     var stack:Int = 0
//     for ch in u {
//         if ch == "(" {
//             stack += 1
//         } else {
//             stack -= 1
//             if stack < 0 {
//                 return false
//             }
//         }
//     }
    
//     if stack == 0 {
//         return true
//     } else {
//         return false
//     }
}
728x90