문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설계
문제에서 주어진 과정을 통해 함수들을 어떻게 구성할지 설계한 후 함수 별로 구현해야 하는 코드를 작성
과정 1번부터 4-5번까지 읽으며 어떤 함수들이 필요한지, 재귀를 어떻게 구성할지 생각
문제 풀이(정답)
import Foundation
// 함수 - 두 균형잡힌 괄호 문자열로 분리
// 입력된 문자열을 두 균형잡힌 괄호 문자열로 나눕니다.
func divideBalance(_ d:String) -> [String] {
var cntL = 0
var cntR = 0
var u = ""
var v = ""
for i in 0..<d.count {
let index = d.index(d.startIndex, offsetBy: i)
if d[index] == "(" {
cntL += 1
} else {
cntR += 1
}
// 여는 괄호와 닫는 괄호의 수가 같아지면 문자열을 분리
if cntR == cntL {
u = String(d[..<d.index(after: index)])
v = String(d[d.index(after: index)...])
break
}
}
return [u, v]
}
// 함수 - 올바른 괄호 문자열 여부 확인
// 입력된 문자열이 올바른 괄호 문자열인지 확인합니다.
func checkRightString(_ r: String) -> Bool {
var stack: [Character] = []
for i in r {
if i == "(" {
stack.append(i)
} else {
if stack.isEmpty {
return false
}
stack.removeLast()
}
}
return stack.isEmpty
}
// 함수 - 올바른 괄호 문자열 아닐 경우 조작
// 올바르지 않은 괄호 문자열을 수정하여 올바른 괄호 문자열로 변환합니다.
func fixString(_ u: String, _ v: String) -> String {
var u = u
var v = v
// 재귀적으로 v를 올바른 괄호 문자열로 변환하고, 여는 괄호와 닫는 괄호를 추가
v = "(" + solution(v) + ")"
// u의 첫 번째와 마지막 문자를 제거
u.removeFirst()
u.removeLast()
var uu = ""
// u의 각 괄호를 반대로 변환하여 uu에 추가
for char in u {
if char == "(" {
uu += ")"
} else {
uu += "("
}
}
// 변환된 v와 uu를 합쳐서 반환
return v + uu
}
// 함수 - 주어진 문자열을 올바른 괄호 문자열로 변환
func solution(_ p: String) -> String {
// 빈 문자열인지 확인
if p.isEmpty {
return ""
}
// 균형잡힌 괄호 문자열로 분리
var u = divideBalance(p)[0]
var v = divideBalance(p)[1]
// u가 올바른 괄호 문자열이면 v에 대해 재귀적으로 solution을 호출하여 결과를 합침
if checkRightString(u) {
return u + solution(v)
} else {
// u가 올바른 괄호 문자열이 아니면 fixString을 호출하여 수정
return fixString(u, v)
}
}
정리
아직도 스위프트의 문자열 접근이 익숙하지 않아서 연습이 필요합니다.
함수로 넘겨준 인자가 매개변수로 들어오면 상수로 취급되어 수정되지 않는 것을 알 수 있었습니다. 수정하려고 하는 바람에 오류가 발생하였고 함수 내에서 복사하여 수정하는 방법을 선택하였습니다.
다른 분이 작성하신 글이 큰 도움이 되었습니다.
[iOS/Swift] 매개변수는 사실 상수였다?! (함수를 호출하는 2가지 방법)
지난 포스팅에서 이어지는 내용입니다. 함수를 처음 강의와 책에서 접했을 때, 매개변수 파트에 매우 집중되어 있다!? 란 느낌적인 느낌을 받았습니다. 함수를 잘~다루기 위해선 짚고 넘어가야
iosdevlime.tistory.com
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / swift] 2019 KAKAO BLIND RECRUITMENT - 후보키 (0) | 2024.07.01 |
---|---|
[프로그래머스 / swift] 2020 KAKAO BLIND RECRUITMENT - 문자열 압축 (0) | 2024.06.20 |
[프로그래머스 / swift] 2019 카카오 개발자 겨울 인턴십 - 튜플 (0) | 2024.06.18 |
[프로그래머스 / swift] 2020 카카오 인턴십 - 수식 최대화 (2) | 2024.06.16 |
[프로그래머스] 2021 카카오 채용연계형 인턴십 - 거리두기 확인하기 (1) | 2024.06.13 |