나의 기록, 현진록

[Swift] 2020 KAKAO BLIND RECRUITMENT 문자열 압축 본문

Programming/Algorithm & Data Structure

[Swift] 2020 KAKAO BLIND RECRUITMENT 문자열 압축

guswlsdk 2022. 5. 15. 23:48
반응형

 

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

 

 

문제 풀이

swift를 공부하면서 느낀 점은 문자열 처리가 힘들다. String을 배열로 처리하여 생각하자.

 

1. 배열(문자열)의 크기가 N일 때 1부터 N까지의 글자수로 압축하는 모든 경우를 구해야한다.

2. 현재 문자열과 다음 문자열이 같으면 압축할 수 있는 것이다. 다음 과정을 반복한다.

3. 압축이 가능한 경우 "\(압축한 수)\(압축한 문자열)"을 새로운 문자열에 추가한다.

4. 압축하지 못 했을 경우 "\(압축 못한 문자열)" 그대로 추가하면 된다.

5. 배열의 크기만큼 이 과정을 반복한 후에 문자열의 길이를 반환한다.

6. 1~5번 과정 중 가장 길이가 짧은 길이가 답이 된다.

 

2번 과정에서 이전 문자열 변수와 현재 문자열 변수를 가지고 비교하며 진행하였다.

 

코드

func solution(_ s:String) -> Int {
    var resultLen = [Int]()
    for i in 1...s.count{
        resultLen.append(compp(len: i, sArr: s.map{String($0)}))
    }
    return resultLen.min()!
}

func compp(len: Int, sArr: [String]) -> Int{
    
    var index = 0
    var preStr = ""
    var result = ""
    var subCount = 0
    
    while index+len <= sArr.count{  // 문자열 총 길이 만큼 될 수 있는대로 문자열에 대해 연산
        let curStr = sArr[index..<index+len].joined() // 문자열 중 len의 길이 만큼 반환
//        print(curStr)
        if preStr == curStr{
            subCount += 1
        }else{
            if subCount > 0{ // 압축이 가능한 경우
                result += "\(subCount+1)\(preStr)"
                subCount = 0
            }else{ // 압축 못 했을 경우
                result += "\(preStr)"
            }
            preStr = curStr
        }
        if index+len > sArr.count - 1 - sArr.count%len{
            break
        }else{
            index += len
        }
    }
    if subCount > 0{
        result += "\(subCount+1)\(sArr[index...sArr.endIndex-1].joined())"
        
    }else if subCount == 0 && index <= sArr.count - 1{
        result += "\(sArr[index...sArr.endIndex-1].joined())"
    }
//    print(result)
    return result.count
}

 

반응형