본문 바로가기

코딩테스트/프로그래머스

코딩테스트 연습 2018 KAKAO BLIND RECRUITMENT [3차] 압축

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

 

프로그래머스

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

programmers.co.kr

Solution

def solution(msg):
    base = dict()
    answer = []
    for i in range(1, 27):
        base[chr(64+i)] = i
        
    # print(base)
    i=0
    while True:
        if len(msg) <= i:
            break
            
        j=2
        count = 0
        while True:
            if len(msg[i:i+j]) != j:
                answer.append(base[msg[i:i+j]])
                break
            elif not msg[i:i+j] in base:
                answer.append(base[msg[i:i+j-1]])
                base[msg[i:i+j]] = len(base) + 1
                break
            else:
                count += 1
            j+=1
            
        i+=1+count
    return answer

주어진 문제에서는 LZW 압축 알고리즘을 구현하여 문자열을 압축하는 작업을 수행해야 합니다. LZW 압축은 입력 문자열을 순회하면서 현재 입력과 일치하는 가장 긴 문자열을 찾고, 해당 문자열에 대한 색인 번호를 출력하고 사전에 등록하는 방식으로 진행됩니다. 이를 통해 주어진 문자열을 압축한 후의 사전 색인 번호를 배열로 출력해야 합니다. 입력으로는 영문 대문자로만 이루어진 문자열이 주어지며, 출력은 압축 후의 사전 색인 번호 배열로 주어집니다. 예시로 주어진 입력에 대한 출력은 문제에서 제시된 예시 출력과 일치해야 합니다.

 

처음에 A부터 Z까지 어떻게 표시할까 하다가 아스키 코드로 변환해주는 ord 함수는 이미 알고있었는데, 그 반대 함수는 몰라서 검색해보았다. chr함수가 그 반대 역할을 한다는 것을 확인, 바로 문제를 푸니까 별 문제 없이 풀 수 있었다.

 

다른 사람의 풀이

 

def solution(msg):
    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    d = {k:v for (k,v) in zip(alphabet, list(range(1,27)))}
    answer = []

    while True:
        if msg in d:
            answer.append(d[msg])
            break
        for i in range(1, len(msg)+1):
            if msg[0:i] not in d:
                answer.append(d[msg[0:i-1]])
                d[msg[0:i]] = len(d)+1
                msg = msg[i-1:]
                break

    return answer

다른 사람들은 A~Z까지 전부 쓰고 그걸 딕셔너리에 넣는 방법으로 풀었다.

신박하군..