프로그래머스

LV2 [KAKAO] [3차] 압축

whiporithm 2023. 8. 15. 22:54


문제

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

 

프로그래머스

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

programmers.co.kr

 

풀이

 

우선 2번의 조건으로 인해서 문자열의 서브 문자열을 모두 검사해서 사전에 등재한 가장 긴 문자열이 존재하는지 검사하는 줄 알았다. 그러나 두번째 예시를 보니까 그냥 앞에서부터 검사하면 되는거였기에 맞게 구현하였다.

 

우선 dictionary 구조로 A ~ Z를 키로, 1 ~ 26 을 값으로 초기화 해준다.

 

이후에는 문자열 첫번째부터 검사하면 되는데 만약 KAKAO이고 내가 검사해야할 위치가 0 이면

K

KA

KAKA

KAKAO 

를 검사하면서 사전에 key로 존재하는지 검사한다. 길어지는 순으로 검사하기에 가장 긴 문자열이 남게 될 것이다.

이후에 정답 배열에 문자열의 value 값을 추가해준다.

 

그 다음에는 key로 찾은 문자열 + 뒤의 문자 하나를 더해서 새로운 key값을 만들어 사전에 저장해준다.

 

K 일 경우, K를 지울필요는 굳이 없고 검사를 A부터 다시 시작하면 된다.
(만약 KA일 경우는 기존에 검사한곳에서 2만큼 띄워진곳부터 검사하는 식이다. 길이 만큼 인덱스를 이동해서 검사한다.)

 

 

코드

def initDict():
    mydict = {}
    dictIdx = 1
    
    for alpha in range(65, 91):
        mydict[chr(alpha)] = dictIdx
        dictIdx += 1
    return mydict, dictIdx

def solution(msg):
    answer = []
    myDict, dictIdx = initDict()
    
    idx = 0
    while True:
        
        if idx >= len(msg): break
        resultStr = ''

        # 현재 문자에서 사전에 등재된 가장 긴 문자열을 찾는다.
        for i in range(1, len(msg)+1-idx):
            value = msg[idx:idx+i]
            if value in myDict:
                resultStr = value    
        
        # 정답 배열에 숫자를 추가해준다.
        answer.append(myDict[resultStr])
        
        if resultStr != '':
            newStr = msg[idx:idx+len(resultStr)+1]
            myDict[newStr] = dictIdx
            dictIdx += 1
        
        idx += len(resultStr)
        
    return answer

 

후기

 

내가 굉장히 귀찮게 정의했던 딕셔너리 초기화를 

 

    myDic = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ", range(1,27)))

 

와 같이 한 것을 봤다. dictionary를 초기화 할 때는 항상 zip을 떠올려보자. 굉장히 깔끔해진다.

'프로그래머스' 카테고리의 다른 글

LV2 [KAKAO] [3차] 방금그곡  (0) 2023.08.17
LV2 [KAKAO] [1차] 캐시  (0) 2023.08.16
LV2 [KAKAO] 튜플  (0) 2023.08.14
LV2 [KAKAO] [1차] 프렌즈4블록  (0) 2023.08.14
LV2 [KAKAO] [3차] 파일명 정렬  (0) 2023.06.20