https://school.programmers.co.kr/learn/courses/30/lessons/60057
풀이 및 소스코드
입력은 최대 1000이니 시간복잡도는..
그냥 잘라나가며 압축하고 개수를 세면 된다.
import Foundation
//문자열을 자르는 함수
func slice(_ n: Int, _ input: String) -> [String]{
var result = [String]()
var tmp = ""
for char in input{
tmp += String(char)
//tmp가 자르고자 하는 n개일 경우 배열에 추가
if tmp.count == n{
result.append(tmp)
tmp = ""
}
}
//나누어 떨어지지 않을 경우 문자열이 남아있게됨 14개를 3개씩 나눈다면 2개가 남으므로 남은거 추가
if tmp != ""{
result.append(tmp)
}
return result
}
//압축하는 함수
func compress(_ input: [String]) -> String{
var result = ""
var tmp = ""
var cnt = 1
var now = input[0]
for word in input{
if tmp == word{//이 전과 현재가 같다면 +1 아래를 실행할 필요 없음
cnt += 1
continue
}else{//다르다면 1개면 단어만, 넘으면 개수와 단어
result += cnt > 1 ? "\(cnt)\(tmp)" : "\(tmp)"
cnt = 1
tmp = ""
}
tmp = word
}
if tmp != ""{//다 끝났는데 ""가 아니면 연속된 단어가 나왔으므로 추가가 안되었을경우
result += cnt > 1 ? "\(cnt)\(tmp)" : "\(tmp)"
}
return result
}
//문자열을 자른다? 총 길이의 반까지만 자를 수 있다
func solution(_ s:String) -> Int {
var result = s.count
//3이하는 압축할 수 없다.
if result < 4 { return result }
for i in 1...Int(s.count/2) {
result = min(result, compress(slice(i, s)).count)
}
return result
}