상세 컨텐츠

본문 제목

[프로그래머스] 압축

Algorithm

by 쑤야. 2023. 12. 26. 13:53

본문

https://school.programmers.co.kr/learn/courses/30/lessons/17684?language=python3

 

프로그래머스

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

programmers.co.kr

 

접근


  • 딕셔너리를 활용하여 [단어 : 색인 번호]와 같이 정보를 저장

 

로직


  1. 아스키 코드를 활용하여 사전 기본 세팅
  2. 현재 입력값 찾기
    • w의 시작 인덱스는 index로 동일, w의 끝 인덱스를 endIndex 변수로 설정하고
    • 사전에 index..<endIndex+1 범위의 단어가 존재하지 않을 때까지 반복문을 수행하여 범위를 찾는다. 
  3. 사전에 추가
    • 2번에서 찾은 endIndex를 활용
    • 사전의 길이 + 1 값으로 새로운 단어를 추가
  4. 출력하기
  5. endIndex로 index 갱신하기

 

코드


1. Python 풀이

def solution(msg):

    map = {}
    for i in range(1,27):
        map[chr(65+i-1)] = i

    msg = list(msg)
    index = 0
    result = []
    
    while index < len(msg):
        # 현재 입력
        w = ""
        endIndex = index
        while endIndex < len(msg) and "".join(msg[index:endIndex+1]) in map:
            w = "".join(msg[index:endIndex+1])
            endIndex += 1
        wc = "".join(msg[index:endIndex+1])
        # 출력
        result.append(map[w])
        # 사전 추가
        map[wc] = len(map)+1
        
        index = endIndex
    
    return result

2. Swift 풀이

func solution(_ msg:String) -> [Int] {
    
    var map = [String: Int]()
    for i in 1...26 {
        map[String(UnicodeScalar(64+i)!)] = i
    }
    
    let msg = Array(msg).map{ String($0) }
    
    var result = [Int]()
    var index = 0
    while index < msg.count {
        // 현재 입력
        var w = ""
        var endIndex = index
        while endIndex < msg.count && map[msg[index..<endIndex+1].joined()] != nil {
            w = msg[index..<endIndex+1].joined()
            endIndex += 1
        }
        // 사전 추가 
        if endIndex < msg.count {
            map[msg[index..<endIndex+1].joined()] = map.count + 1
        }
        // 출력
        result.append(map[w]!)
        
        index = endIndex
    }
    
    return result
}

관련글 더보기