프로그래머스 - 괄호 변환(Lv. 2)

OQ·2022년 3월 8일
0

프로그래머스

목록 보기
14/33

문제 링크

풀이

import Foundation

func solution(_ p:String) -> String {
    let pArr = p.map { String($0) }

    return recursive(pArr)
}

// 올바른 괄호 문자열로 만들어주는 재귀 메서드
func recursive(_ pArr: [String]) -> String {
    var u: [String] = [] // 균형잡힌 괄호 문자열
    var v = ""
    
    var openCount = 0
    for (index, p) in pArr.enumerated() {
        u.append(p)
        
        if p == "(" {
            openCount += 1
        } else {
            openCount -= 1
        }
        
        if openCount == 0 {  // 균형잡힌 괄호가 완성됐다면 탈출
            if pArr.count > index + 1 {
                v = recursive(Array(pArr[(index + 1)...]))
            }
            
            break
        }
    }
    
    if u.count == 0 {
        return v
    } else if u[0] == ")" { // 의미를 알 수 없는 지문의 '4번째 기능' 수행
        return "("  // 4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다. 
        + v // 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. 
        + ")"   // 4-3. ')'를 다시 붙입니다. 
        + reverse(u)
    } else {
        return u.reduce("") { $0 + $1 } + v
    }
}

func reverse(_ pArr: [String]) -> String {
    let array = pArr[1..<(pArr.count - 1)]
    var output = ""
    
    if array.count == 0 {
        return output
    } else {
        for p in array {
            if p == "(" {
                output += ")"
            } else {
                output += "("
            }
        } 
    }
    
    return output
}

후기

문제 지문이 쓰레기 좀 구려서 애먹었던 문제.
괄호 이쁘게 맞추는 단순한 문제인데 지문에 나온 괴상한 로직을 무조건 따라해야한다.
문제는 지문의 로직이 대부분 생각하지 못하는 괴상한 로직이라는 것.
지문 꼼꼼히 안 읽으면 백퍼 실패한다.

profile
덕업일치 iOS 개발자

0개의 댓글