📖  문제

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

 

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

TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

programmers.co.kr

 

💻  코드

def zipping(msg, d, answer):
    # 가장 긴 문자열을 구하므로 인덱싱은 뒤에서부터
    for i in range(len(msg), 0, -1):
        # 2단계부터 4단계 요구사항 구현
        if d.get(msg[:i]):
            answer.append(d[msg[:i]])
            if len(msg[i:]) != 0:
                d[msg[:i + 1]] = len(d) + 1
            return msg[i:]


def solution(msg):
    answer = []
    d = dict()
    # A부터 Z까지 입력
    for a in range(65, 91):
        d[chr(a)] = a - 64
    # 메시지가 남아있다면 압축
    while len(msg) != 0:
        msg = zipping(msg, d, answer)
    return answer

 

🙌  한마디

구현 문제고 특별한 알고리즘이 사용되지 않는 문제였다. 문자열 파싱 문제인데 요구사항이 구현하기 좀 헷갈린다는 점이 특징이다. 예전에 이 문제를 푼적이 있어 이번이 두번째 풀이인데, 처음에 풀 때 많이 애를 먹었던 기억이 난다. 그 때 당시 코드를 보니 가장 긴 문자열을 찾는데 문자열 인덱싱을 0부터 시작했었다. 그러다보니 로직이 꼬여서 애를 먹었었다. 뒤에서부터 인덱싱을 하면 처음 찾은 값이 바로 가장 긴 문자열이지만, 0부터 인덱싱을하면 값이 나온다 할지라도 그 값이 가장 긴 문자열인지 알 수가 없다. 그래서 뒤에서부터 인덱싱하는 것이 맞다. 이번에는 무난하게 풀려서 다행이다. 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기