본문 바로가기
코딩테스트

[파이썬] 압축 - 2018 KAKAO BLIND RECRUITMENT [CODING TEST #39]

by ALTERww 2022. 8. 3.
320x100

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

 

 

알파벳에 대한 딕셔너리 alpha_dict를 미리 만든다.

그리고 msg 내 word를 살펴 보면서 alpha_dict에 없는 단어는 alpha_dict 맨 끝에 추가하고, 마지막으로 살펴본 글자부터 압축을 다시 시작한다.

구현 조건이 은근 까다로웠던 것 같다. 두 가지 조건을 잘 구현해야 한다.

  • 첫 번째 알파벳은 무조건 alpha_dict에 존재하므로, 다음 단어를 스킵할 때 len(word) == 1의 경우는 스킵하면 안 된다. 무조건 alpha_dict에 있기 때문. 그래서 첫 글자에 대한 코드는 while문 앞에 따로 구현하였다.
  • word가 마지막 글자까지 오면 해당 idx를 저장하고 탐색을 바로 마친다.
    이 때 while 문 안에 있는 건 이중 루프이므로 flag를 정의해서 바로 끝내도록 구현하였다.
    (이거 찾느라 30분 정도 걸린듯)

 

def solution(msg):
    answer = []
    alpha_dict = {'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,'K':11,'L':12,'M':13,'N':14,
                 'O':15,'P':16,'Q':17,'R':18,'S':19,'T':20,'U':21,'V':22,'W':23,'X':24,'Y':25,'Z':26}
    # 스킵할 인덱스 수 count
    count = 0
    # while문에서 즉시 종료하기 위한 flag
    flag = False
    for i, word in enumerate(msg):
        idx = alpha_dict[word]
        if count >0: # count만큼 pass.
            count -= 1
            continue    
        if len(word)==1: # 첫 글자는 무조건 dict에 존재함. 다음 step으로
            idx = alpha_dict[word]
            if i+1 == len(msg): # msg 마지막 글자면 break.
                answer.append(idx)
                break
            i += 1
            word += msg[i]
            while word in alpha_dict.keys(): # 둘 이상 문자열이 dict에 있는 경우 -> dict에 없는 문자를 만날 때까지.
                idx = alpha_dict[word]
                if i+1 == len(msg): # msg 마지막 글자면 break.
                    answer.append(idx)
                    flag = True # 이중 loop이므로 flag를 이용해 즉시 종료
                    break
                i += 1
                word += msg[i]
                count += 1    
        if flag == True:
            break
        # dict에 없는 경우.
        alpha_dict[word] = 27 + len(answer)
        answer.append(idx)
    return answer

댓글