https://programmers.co.kr/learn/courses/30/lessons/60057
압축할 문자열 s가 매개변수로 주어질 때, 위에 설명한 방법으로 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 return 하도록 solution 함수를 완성해주세요.
let s = "aabbaccc"
7
자르는 단위는 1에서부터 s의 길이의 절반까지가 가능하다. s의 길이가 1 또는 2인 경우 압축을 해도 길이가 그대로이므로 초반에 해당 길이를 리턴한다.
func solution(_ s:String) -> Int {
if s.count < 3 { return s.count }
var result: Int = s.count
for length in 1...s.count/2 {
let slicedString = sliceString(s, length)
let compressedString = compressString(slicedString)
let length = compressedString.count
if length < result { result = length }
}
return result
}
for문에서 length가 1인 경우 아래와 같이 나온다. 아래에서 하나씩 함수들을 살펴보자.
slicedString = ["a", "a", "b", "b", "a", "c", "c", "c"]
compressedString = 2a2ba3c
length = 7
sliceString함수는 정해진 길이 length만큼 문자열을 잘라 배열 형태로 반환하는 함수이다.
func sliceString(_ str: String, _ length: Int) -> [String] {
var result: [String] = []
var temp = ""
for s in str {
temp += String(s)
if temp.count >= length {
result.append(temp)
temp = ""
}
}
if temp != "" { result.append(temp) }
return result
}
compressString함수는 문자열 배열을 받아 압축을 하는 함수이다.
func compressString(_ array: [String]) -> String {
var result: String = ""
var temp: String = ""
var count: Int = 1
for str in array {
if temp == str {
count += 1
} else {
if temp != "" {
result += (count > 1) ? "\(count)\(temp)" : "\(temp)"
}
temp = str
count = 1
}
}
if temp != "" { result += (count > 1) ? "\(count)\(temp)" : "\(temp)" }
return result
}