[Level 2] 문자열 압축 + Swift

sanghee·2021년 11월 16일
0

🙈코딩테스트

목록 보기
46/52
post-thumbnail

문제 링크

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

문제

압축할 문자열 s가 매개변수로 주어질 때, 위에 설명한 방법으로 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 return 하도록 solution 함수를 완성해주세요.

입력

let s = "aabbaccc"

출력

7

문제 풀이

1. solution 함수

자르는 단위는 1에서부터 s의 길이의 절반까지가 가능하다. s의 길이가 1 또는 2인 경우 압축을 해도 길이가 그대로이므로 초반에 해당 길이를 리턴한다.

func solution(_ s:String) -> Int {
    if s.count < 3 { return s.count }
    
    var result: Int = s.count
    
    for length in 1...s.count/2 {
        let slicedString = sliceString(s, length)
        let compressedString = compressString(slicedString)
        let length = compressedString.count
        if length < result { result = length }
    }
    
    return result
}

for문에서 length가 1인 경우 아래와 같이 나온다. 아래에서 하나씩 함수들을 살펴보자.

slicedString = ["a", "a", "b", "b", "a", "c", "c", "c"]
compressedString = 2a2ba3c
length = 7

2. 문자열 정해진 길이로 자르기

sliceString함수는 정해진 길이 length만큼 문자열을 잘라 배열 형태로 반환하는 함수이다.

func sliceString(_ str: String, _ length: Int) -> [String] {
    var result: [String] = []
    var temp = ""
    
    for s in str {
        temp += String(s)
        if temp.count >= length {
            result.append(temp)
            temp = ""
        }
    }
    
    if temp != "" { result.append(temp) }
    return result
}

3. 문자열 배열 압축하기

compressString함수는 문자열 배열을 받아 압축을 하는 함수이다.

func compressString(_ array: [String]) -> String {
    var result: String = ""
    var temp: String = ""
    var count: Int = 1
    
    for str in array {
        if temp == str {
            count += 1
        } else {
            if temp != "" {
                result += (count > 1) ? "\(count)\(temp)" : "\(temp)"
            }
            temp = str
            count = 1
        }
    }
    
    if temp != "" { result += (count > 1) ? "\(count)\(temp)" : "\(temp)" }
    return result
}
profile
👩‍💻

0개의 댓글