본문 바로가기

Algorithm/카카오

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

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

 

프로그래머스

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

programmers.co.kr

 

 

1. 해결방법

생각보다 헤맸던 문제이다.
2시간 정도 걸렸다;;

처음 접근하는 방법이 중요하다. 다른 방법으로 시도한 끝에 결국 딕셔너리를 이용하는게 맞다고 판단이 되어서 딕셔너리를 사용하였다.

1. msg 문자열의 각 알파벳의 아스키코드 값을 dict라는 딕셔너리에 저장한다.
2. left와 right을 두어서 각 문자열이 dict에 있는지 없는지 판단해야한다. (w, c)
3. w와 c를 구해서 더한 값이 dict에 있다면 right + 1을 해서 검사 범위를 더 넓힌다.
4. 만약 w + c가 dict에 없다면 새로운 사전을 추가시킨다.
5. 추가 시키면 left와 right 값을 새로이 갱신한다. 

 

 

2. 정답코드

def solution(msg):
    answer = []
    dict = {}
    for m in msg:
        dict[m] = ord(m) - 64

    left, right = 0, 1
    new_number = 27
    while True:
        w = msg[left: right]
        if right != len(msg):
            c = msg[right]

            if w + c in dict:
                right += 1
                continue

            if w + c not in dict:
                dict[w + c] = new_number
                new_number += 1

            if w in dict:
                answer.append(dict[w])
                left = right
                right = left + 1
        else:
            if msg[left : right] in dict:
                answer.append(dict[msg[left : right]])
                break

    return answer