[Swift] 프로그래머스, 문자열 압축

문제 링크

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

잡담

아.. 문제 눌렀는데, 카카오 2020 공채 문제라고 뜨길래 식겁했습니다… 😅 시작 전부터 기에 눌려서 풀 수 있을까라는 생각이 들었는데, 풀긴 풀었네요..

문자열을 다루는 문제라서 확실히 Swift로는 풀기 힘들다고 느껴졌어요.. 뭔가 파이썬으로 했으면 더 쉽고 간단하게 하지 않았을까라는 생각이 많이 들었습니다.

풀이

String을 쪼개야하는데, 일단 받은 문자열을 Array에 넣어서 쪼개줬어요

// s는 String
  Array(s)

이렇게 넣으면 character로 쪼개지더라구요! 이 상태에서 배열을 map해서 String으로 변환해줬습니다.

그 다음엔 reduce를 사용해서 분할하는 길이 만큼 String을 재생성 해줬어요

sum = list[index...list.count-1].reduce("", {
                $0+$1
            })

이렇게 쪼개는 길이만큼만 분할해서 합쳐줬습니다. 뭔가 이 부분이 뿌듯하더라구요 ㅋㅋㅋ 고차함수를 필요한 타이밍에 잘 쓴 느낌 ㅎㅎ

그런 다음은 뭐.. 그냥 인덱스를 증가시키면서 조건에 따라 붙이고 그냥 그런.. 알고리즘은 딱히 필요없고, 반복문을 도는 형태로 구현하게 되었습니다.

구현 문제라서 그런지 딱히 알고리즘은 필요 없었던 것 같아요! 하지만 계속 조건문을 추가하다보니 depth가 좀..

코드

//
//  main.swift
//  문자열압축
//
//  Created by 남기범 on 2020/12/26.
//  Copyright © 2020 남기범. All rights reserved.
//

import Foundation

func solution(_ s: String) -> Int {
    let arr = Array(s).map { String($0) }
    var result = arr.count
    
    for i in 1...arr.count {
        let resultString = zip(length: i, list: arr)
        result = min(result, resultString.count)
    }
    
    return result
}

func zip(length: Int, list: [String]) -> String {
    var result = ""
    let volum = length-1
    var index = 0
    var before = ""
    var count = 1
    
    while index < list.count {
        var sum = ""
        if index + volum >= list.count-1 {
            sum = list[index...list.count-1].reduce("", {
                $0+$1
            })
        } else {
            sum = list[index...index+volum].reduce("", {
                $0+$1
            })
        }
        
        if before == sum {
            count += 1
            
            if index + volum >= list.count-1 {
                if count != 1 {
                    before = String(count) + before
                }
                result.append(before)
            }
        } else {
            if count != 1 {
                before = String(count) + before
            }
            result.append(before)
            before = sum
            count = 1
            
            if index + volum >= list.count-1 {
                result.append(before)
                break
            }
        }
        
        index += length

    }
    
    return result
}