코딩테스트/프로그래머스

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

clamp 2023. 2. 23. 23:03

https://school.programmers.co.kr/learn/courses/30/lessons/60057

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.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
}