알고리즘/프로그래머스

[2018 KAKAO BLIND RECRUITMENT] [3차] 압축

래울 2021. 8. 22. 09:32

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

 

- 풀이

 

1. 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
  - 리스트 d에 초기화사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
  - 사전의 뒤에서 부터 검색하며, re.match로 w를 찾는다. (뒤에서부터 검색해야 가장 길게 일치하는 것이 찾아진다.)

2. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
  - 사전의 색인번호를 answer에 추가, 사전의 색인번호는 1부터 시작하므로, i+1을 해준다.
  - msg에서 w만큼을 제거해준다.

3. 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.

4. 단계 2로 돌아간다.
  - 만약 남은 문자가 없으면, 종료

 

 

 

re.match(패턴, 문자열, 플래그) : 문자열의 처음부터 시작해서 작성한 패턴이 일치하는지 확인한다.

re.match("KA", "KAKAO").group() : "KA"를 반환한다.

# 문자열의 처음부터 일치하는지 확인하므로, 패턴"AKA" 등은 일치 X

RE모듈 : https://doraeul19.tistory.com/79

 

import re
def solution(msg):
    answer = []
    d = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N',
           'O','P','Q','R','S','T','U','V','W','X','Y','Z']
    while True:
        for i in range(len(d)-1, -1, -1):   #뒤에서 부터 검색
            if re.match(d[i], msg):
                answer.append(i+1)
                w = re.match(d[i], msg).group()
                msg = msg[len(d[i]):]
                if len(msg) > 0:
                    d.append(w+msg[0])
                break
        if len(msg) == 0:
            break        
    return answer