https://programmers.co.kr/learn/courses/30/lessons/60058?language=swift
순서대로 로직을 주었으나 말이 좀 어렵게 느껴짐 + 구현하다보니 길어짐 + 내가 제대로 하고 있는건지 긴가민가..
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)
}
'Algorithm' 카테고리의 다른 글
Programmers 쿼드압축 후 개수 세기 [Swift] (0) | 2021.09.15 |
---|---|
프로그래머스 - 최솟값 만들기 [Swift] (0) | 2021.09.15 |
프로그래머스 - 프린터 Swift (0) | 2021.09.07 |
프로그래머스 - 수식 최대화 [Swift] (0) | 2021.09.06 |
프로그래머스 - 5주차[Swift] (0) | 2021.09.06 |
최근댓글