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

Junyoung Park·2022년 5월 23일
0

코딩테스트

목록 보기
425/631
post-thumbnail

1. 문제 설명

문자열 압축

2. 문제 분석

문자열을 배열로 변환해서 풀면 (적어도 스위프트에서는) 접근하기 보다 편리해진다. 인덱스에 접근하기 전 카운트를 통해 조건을 제어하자.

3. 나의 풀이

import Foundation

func solution(_ s:String) -> Int {
    var minAnswer = Int.max
    if s.count == 1 {
        return 1
        // 압축할 필요 X
    }
    
    let str = Array(s)
    
    
    for i in 1..<str.count / 2 + 1{
        // 최대 압축 절반 가능
        var result = ""
        var cnt = 1
        var sPrefix = str[0..<i]
        // i번까지의 문자열 -> prefix
        for j in stride(from: i, to: str.count, by: i) {
            // i에서 시작, prefix가 몇 개 있는지 카운트
            if sPrefix == str[j..<(i+j < str.count ? i+j : str.count)] {
                // count를 넘기면 인덱스 에러가 뜨기 때문에 체크
                cnt += 1
            } else {
                // prefix가 더 이상 일치하지 않는다면 prefix를 바꿔준다.
                // 지금까지 prefix 개수를 result에 입력해두기
                if cnt != 1 {
                    result += String(cnt) + sPrefix
                    // 두 개 이상 존재한다면 몇 개 존재하는지 숫자로 표현
                } else {
                    result += sPrefix
                    // 한 번만 존재한다면 1을 붙이지 않는다
                }
                sPrefix = str[j..<(i+j < str.count ? i+j : str.count)]
                cnt = 1
                // prefix 및 prefix가 나온 개수 cnt 초기화
            }
        }
        if cnt != 1 {
            result += String(cnt) + sPrefix
        } else {
            result += sPrefix
        }
        // for문 끝난 뒤 남아 있는 prefix 카운트 반영
        minAnswer = min(minAnswer, result.count)
    }
    return minAnswer
}
profile
JUST DO IT

0개의 댓글