study/알고리즘

[python] programmers - 압축

It's Hyeeun Time 2022. 8. 13. 01:07

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

 

프로그래머스

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

programmers.co.kr

SOLUTION 

 

- 사전에 한 글자 길이를 가진 단어들의 색인 번호 정보를 추가

- msg를 현 위치에서 한 글자씩 늘려가며 글자가 추가된 단어가 사전에 있는지 확인

- 최대 길이의 색인 번호가 존재하는 단어를 찾아 answer에 추가해줌

- 위의 단어 + 다음 위치 알파벳을 추가한 단어가 사전에 없는 경우 해당 단어를 현재 최대 색인 번호 + 1로 정보 저장

 

 

CODE  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def solution(msg):
    
    # 정답 배열
    answer = []
    # 사전dict  {'A': 1, 'B': 2, ...}
    words = {}
    
    # 한글자 A~Z 알파벳 색인 번호 정보를 사전 dict에 추가
    for i in range(ord('Z'- ord('A'+ 1):
        words[(chr(i+65))] = i+1
    
    # while 통해 단어를 확인
    i = 0
    while i < len(msg):
        
        # 현재 위치 시작 지점 알파벳을 우선 word로 지정
        word = msg[i]
        # j는 다음 위치 알파벳을 포함한 단어가 words에 있는지 확인하기 위한 변수
        j = 1
        # 다음 알파벳이 존재하며 알파벳을 추가한 단어가 사전에 있을 때까지 다음 알파벳 추가
        while i+< len(msg) and word in words:
            word += msg[i+j]
            j += 1
        
        # 만일 단어가 words에 있는 단어라면 answer에 해당 단어의 색인 번호를 넣고
        if word in words:
            answer.append(words[word])
            # 그 단어만큼을 뛰어서 msg 확인
            i += len(word)
        # 만일 단어가 words에 없다면
        else:
            # 현재 words에서 가장 큰 색인 번호를 추출해 해당 단어를 max 색인 번호 + 1에 추가
            max_val = max(words.values())+1
            words[word] = max_val
            # 그리고 마지막 한 자리를 뺀 단어의 색인 번호를 answer에 추가
            answer.append(words[word[:len(word)-1]])
            # 한 자리 뺀 단어의 길이만큼 뛰어서 msg 확인
            i += len(word)-1
    
    return answer
cs