https://school.programmers.co.kr/learn/courses/30/lessons/60057
프로그램 제작자
코드 중심 개발자를 고용하십시오. 스택 기반 위치 일치. 프로그래머를 위한 개발자별 프로필에 가입하고 기술 호환성이 좋은 회사와 연결하십시오.
프로그래머.co.kr
솔루션 및 소스 코드
최대 입력이 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
}