코딩테스트/프로그래머스

[프로그래머스] [Level 2] [2018 KAKAO BLIND RECRUITMENT 3차]압축

박소민 2022. 6. 17. 19:05
압축
 

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

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

programmers.co.kr

 

  • 내 풀이
    • 대문자 'A'~'Z' 리스트 삽입
      • 색인 번호가 인덱스가 되도록 0번에는 숫자 0을 채움
      • 아스키코드 대문자 65~90/ 소문자 97~122
      • 숫자→ 아스키코드 : chr(n)
    • 풀이 방법 
      • 현재 단어가 사전에 없을 경우
      • 있을 경우
        • 다음 단어를 붙인 단어가 사전에 있을 경우
          • 단어를 이어서 붙임
        • 없을 경우
          • 현재까지의 단어를 사전에 등록
          • 다음 단어를 붙인 단어도 사전에 등록
          • 단어 리셋
def solution(msg):
    #아스키코드 대문자 65~90/ 소문자 97~122
    dic=[chr(64+i) if i!=0 else 0 for i in range(27) ]
    answer=[]
    word=''
    
    for i,m in enumerate(msg):
        word+=m
        if i==len(msg)-1:
            answer.append(dic.index(word))
            break
            
        if word not in dic:
            dic.append(word)
            answer.append(dic.index(word))
        else:
            if word+msg[i+1] in dic:
                continue
            else:
                answer.append(dic.index(word))
                word+=msg[i+1]
                dic.append(word)
                word=''
        
    return answer

 

  • 다른 사람 풀이
    • 딕셔너리 활용
    • 📍알파벳을 전부 리스트에 넣은 후에 비교
      • 아스키코드를 외울 수 없으니까 이 방법 사용하기
def solution(msg):
    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    d = {k:v for (k,v) in zip(alphabet, list(range(1,27)))}
    answer = []

    while True:
        if msg in d:
            answer.append(d[msg])
            break
        for i in range(1, len(msg)+1):
            if msg[0:i] not in d:
                answer.append(d[msg[0:i-1]])
                d[msg[0:i]] = len(d)+1
                msg = msg[i-1:]
                break

    return answer