728x90
https://programmers.co.kr/learn/courses/30/lessons/60058?language=swift
문제대로 착실히 재귀함수를 구현해도 잘 풀리는 문제..
그래서 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
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 가사 검색 (Swift) (스터디) (0) | 2022.03.28 |
---|---|
[프로그래머스] 자물쇠와 열쇠 (Swift) (0) | 2022.03.24 |
[프로그래머스] 문자열 압축 (Swift) (0) | 2022.03.23 |
[프로그래머스] 카드 짝 맞추기 (Swift) (0) | 2022.03.23 |
[프로그래머스] 순위 검색 (C++, Swift) (0) | 2022.03.16 |