Swift랑 친해지기/programmers 풀기

[프로그래머스] 2018 KAKAO BLIND RECRUITMENT[3차] 압축 (Swift)

데브킹덕 2023. 6. 26. 16:07

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

 

프로그래머스

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

programmers.co.kr

풀이

1. Unicode와 딕셔너리를 이용해 key값을 A - Z (String)까지 value 값을1 -26 (Int)까지 알맞게 데이터 저장

 

2. 파라미터 msg의 인덱스를 이용하여 문자열을 잘랐음

 

3. 자른 문자열을 딕셔너리가 가지고 있지 않을때를 기준으로 dic에 데이터를 저장하도록 하였음 

 

이때 두개 이상의 문자길이를 가지고 있을 경우 다음 입력의 순서를 건너 뛰어야 하므로 wcount를 사용하였음

 

4.endNum이 msg.count에 도달하게 되면 더 이상 입력할 것이 없으므로 result에 추가하고 리턴하도록 하였음

func solution(_ msg:String) -> [Int] {
    
    let initalAlphabet = Unicode.Scalar("A").value
    let endAlphabet = Unicode.Scalar("Z").value
    
    var dic: [String : Int] = [:]
    var count = 0
    
    for i in initalAlphabet...endAlphabet{
        if let alphabet = Unicode.Scalar(i){
            count += 1
            dic[String(alphabet)] = count
        }
    }
    /*
    1. Unicode와 딕셔너리를 이용해 key값을 A - Z (String)까지 value 값을1 -26 (Int)까지 알맞게 데이터 저장
    현재 count = 26 (Z)
    */
    
    var startNum = 0
    var endNum = 0
    
    var result:[Int] = [Int]()
    
    while startNum < msg.count{
        var wcount = 0
        var w:String = ""
        for i in startNum+1...msg.count{ // 문자열의 범위는 시작점보다 크고 msg.count까지
            endNum = i
            let startIndex = msg.index(msg.startIndex, offsetBy: startNum)
            let endIndex = msg.index(msg.startIndex, offsetBy: endNum)
            var slice_msg = msg[startIndex..<endIndex]
            
            if dic.keys.contains(String(slice_msg)){
                w = String(slice_msg)
                wcount += 1
            } // wcount를 이용해 1보다 클경우, 다음 문자열에 접근하는 것이 아니라 거리만큼 다음 이동후 문자열에 접근하도록 함
            else{
                if wcount > 1 {
                    startNum = startNum + (wcount - 1)
                } //다음 문자열시작지점 이동
                count += 1
                dic[String(slice_msg)] = count
                result.append(dic[w] ?? -1)
                wcount = 0
                break 
            } // dic에 없으므로 데이터 저장하고 출력
            if i == msg.count{
                result.append(dic[w] ?? -1)
                return result
            } //마지막 문자열에 접근했으므로 출력하고 반환 
        }
        startNum += 1
    }
    return result
}