PS/프로그래머스

[프로그래머스] 압축

Hamp 2024. 9. 15. 15:31
반응형

문제

 

프로그래머스

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

programmers.co.kr

 

 

해석

처음 A ~ Z 까지는 1 ~ 26까지 색인번호가 명시되어 있고 

주어진 문자를 하나씩 순회하며 다음글자와의 조합 (w+c) 사전에 존재하는 지 여부에 따라 분기가 나눠진다.

 

만약 존재한다면

  • 별도의 출력 없이 현재 문자열이 w+c로 갱신되고

만약 존재하지 않는다면

  • 현재 문자열의 색인을 출력
  • w+c를 사전에 추가한다
  • 또한 현재문자열(w)는 다음 문자열(c)가 된다.

여기서 중요한 점은 나는 w를 문자열의 첫 문자가 아닌 공백("")문자열로 시작했다. 

이렇게 해야 인덱스 접근이 보다 편하고 분기가 간편해진다.

 

코드

import Foundation

extension String {
    subscript(_ index: Int) -> String {
        return String(self[self.index(self.startIndex, offsetBy: index)])
    }
}


func solution(_ msg:String) -> [Int] {

    var answer: [Int] = []
    var dict: [String: Int] = [:] 
    var a: Character = "A"
    var index: Int = 1
    let length = msg.count
    
    // A ~ Z 색인번호 삽입 
    for i in 0...25 {
        let letter = String(Character(UnicodeScalar(65+i)!))
        dict[letter] = i+1
    }
    
    var w = ""
    
    for index in 0..<length {
        
        let c = msg[index] // 다음 문자열 
        
        let wc = w + c 
        
        if dict[wc] != nil { // 존재하면 w를 wc로 갱신 
            w = wc 
        } else { // 존재하지 않으면 
            answer.append(dict[w]!) // 현재 입력의 색인 출력 
            w = c // 다음 글자로 갱신 
            dict[wc] = dict.count+1 // w+c 사전추가
            
        }
        
    }

    answer.append(dict[w]!) // 마지막 현재 값 추가 
    
    return answer
}

 

 

반응형