[프로그래머스 LV2] 압축

Junyoung Park·2022년 8월 23일
0

코딩테스트

목록 보기
582/631
post-thumbnail

1. 문제 설명

압축

2. 문제 분석

주어진 문제 설명에 따라 문자열을 스캔하면서 현재 사전에 등록된 가장 긴 문자열이 무엇인지 찾는다. 이때 주의해야 할 점은 '등록된 문자열'이란 곧 현재 입력 문자열로 시작하는 문자 중 가장 긴 길이라는 점이다. 또한 현재 문자열에서 시작, 길이가 긴 문자열을 찾았다면 다음 입력값에서 자연스럽게 제외되기 때문에 인덱스를 오프셋으로 카운팅했다.

3. 나의 풀이

import Foundation

func solution(_ msg:String) -> [Int] {
    var wordDict = initWordDict()
    var result = [Int]()
    let letters = Array(msg).map{String($0)}
    
    func getZip() {
        var curOffset = -1
        for idx in 0..<letters.count {
            if curOffset >= idx {
                continue
            }
            var length = 1
            var word = ""
            for curLength in 1...letters.count-idx {
                let curWord = letters[idx..<idx+curLength].joined()
                if wordDict[curWord] == nil {
                    break
                } else {
                    length = curLength
                    word = curWord
                }
            }
            curOffset = idx + length - 1
            result.append(wordDict[word]!)
            if idx + length < letters.count {
                let newWord = word + letters[idx+length]
                wordDict[newWord] = wordDict.count + 1
            }
        }
    }
    getZip()

    return result
}

func initWordDict() -> [String: Int] {
    let alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    var wordDict = [String:Int]()
    var letterIndex = 1
    for letter in alphabets {
        let letter = String(letter)
        wordDict[letter] = letterIndex
        letterIndex += 1
    }
    return wordDict
}
profile
JUST DO IT

0개의 댓글