Mac Plus

Hello Swift

프로그래머스-문자열압축(Swift)

문제 해설
  • 문자열 압축문제를 풀때 최대로 압축할수 있는게 n/2개 라고 생각해둔다. ex) 문자열이 abcdabcd개일때 최대로 압출할수 있는게 2abcd가 되기 때문에
  • 1개씩 압축할때, 2개씩압축, 3개씩압축 …. n개씩 압축이라고 할때 모든 n개의 압축 문자열을 비교한다.
  • 문자열을 해당 압축개수만큼 잘라서 배열에 집어넣어놓는게 가장 어려웠음ㅠ 이것만 넣으면 그다음부터는 for문돌면서 비교하면 된다.
func cut(_ s: String, _ length: Int) -> Int {
    var arr: [String] = [], result: [String] = []
    var cnt = 0, rem = 0, wordCnt = 0
    var word = ""
    
    //짝수개일때와 홀수개일때를 비교하여 홀수개일때는 맨 마지막에 추가로 count시켜줌
    if s.count % length == 0 {
        cnt = s.count / length
    } else {
        cnt = s.count / length
        rem = s.count % length
    }

    var firstIndex = s.index(s.startIndex, offsetBy: 0)
    var lastIndex = s.index(s.startIndex, offsetBy: 0)

    //여기서 firstIndex와 lastIndex를 변경하면서 arr에 넣어줌
    for _ in 0..<cnt {
        lastIndex = s.index(lastIndex, offsetBy: length)
        arr.append(String(s[firstIndex..<lastIndex]))
        firstIndex = lastIndex
    }
    
    for i in 0..<arr.count {
        if word == "" {
            word = arr[i]
            wordCnt += 1
        } else {
            if word == arr[i] {
                wordCnt += 1
            } else {
                if wordCnt == 1 {
                    result.append("\(word)")
                } else {
                    result.append("\(wordCnt)\(word)")
                }
                word = arr[i]
                wordCnt = 1
            }
        }
    }
    if wordCnt == 1 {
        result.append("\(word)")
    } else {
        result.append("\(wordCnt)\(word)")
    }
    
    return result.joined().count + rem
}

func solution(_ s:String) -> Int {
    let count = s.count / 2
    var minArr: [Int] = []
    
    if s.count == 1 { return 1} //문자열이 1개일때 처리
    
    for i in 1...count {
        let minValue = cut(s, i)
        minArr.append(minValue)
    }
    
    return minArr.min()!
}
print(solution("a"))