(Swift) Programmers 압축

SteadySlower·2023년 1월 20일
0

Coding Test

목록 보기
212/298

코딩테스트 연습 - [3차] 압축

문제 풀이 아이디어

문제에서 나온 그대로 구현하기만 하면 됩니다. 예시에 나온 변수명 w와 c를 그대로 사용해서 구현해보았습니다. i는 c의 index입니다.

주의할 점은 두 가지입니다. 먼저 마지막에 반복문을 탈출하고 나서 dict[w]를 ans에 추가하는 것을 잊지 말도록 합시다! 그리고 처음에 사전을 초기화할 때 아스키코드를 활용하면 편하게 할 수 있습니다.

코드

func solution(_ msg:String) -> [Int] {
    // A ~ Z까지 사전 초기화 하기
    var dict = [String:Int]()
    let baseAscii = Int(Character("A").asciiValue!)
    for i in 0..<26 {
        let s = String(UnicodeScalar(baseAscii + i)!)
        dict[s] = i + 1
    }
    
    // index로 탐색할 수 있도록 Array로 바꾸기
    let msg = msg.map { String($0) }
    
    // i는 c의 index
    var i = 1
    // w에 첫 글자 세팅
    var w = msg[0]
    
    // 정답을 저장할 배열
    var ans = [Int]()
    
    while i < msg.count {
        let c = msg[i]
        let wc = w + c
        
        // wc가 사전에 없는 경우
        if dict[wc] == nil {
            ans.append(dict[w]!) // 출력하고
            dict[wc] = dict.count + 1 // 사전에 wc를 추가한다.
            w = c // w는 다음 글자인 c
            i += 1 // 다음 c의 index는 뒤로 하나 이동
            continue
        }
        
        // 사전에 있는 경우 w에 c를 더하고 다시 탐색
        w = wc
        i += 1
    }
    
    // 다음 c가 없을 때 마지막에 남은 w 출력
    ans.append(dict[w]!)
    
    return ans
}
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글