프로그래머 – 문자열 압축 Swift(구현)

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
}