본문 바로가기

프로그래머스

2020 카카오 코딩테스트 - 어피치 문자열 압축문제

반응형

2020년 카카오 블라인드 채용이다.

신입 개발자를 코딩테스트를 통해 선별해낸다.

한번 풀어봤는데,

생각보다 어렵다ㅜㅜ

 

34점 맞아서, 틀린 코드다.ㅠㅠ

 

def solution(s):
    answer = 0
    
    tmp = s[1:]
    try:
        a = tmp.index(s[0])
    except:
        return len(s)
    
    arr = list(range(1, int(len(s)/2)+1))
    
    arr = sorted(arr, reverse=True)
    
    is_find = 0
    for i in arr:
        if s[:i] == s[i:i+i]:
            is_find = i
            break
            
    how_loop = len(s)/is_find
    rest_ = 0
    
    if how_loop % 1 != 0:
        rest_ = len(s) - (int(how_loop) * is_find)
    else:
        rest_ = 0
    
    count = 0
    arr_ = []
    for i in range(1, int(how_loop)):
        if s[is_find*(i-1):is_find*i] == s[is_find*i:is_find*(i+1)]:
            arr_.append(1)
        else:
            arr_.append(0)
    
    is_count = 0
    arr__ = []
    answer = 0
    for i in arr_:
        if i == 1:
            is_count += 1
        else:
            if is_count != 0:
                answer += is_find + len(str(is_count))
                is_count = 0
            else:
                answer += 1
    if arr_[-1] != 0:
        answer += is_find + len(str(is_count))
    else:
        answer += is_find
    answer += rest_
    return answer

 

다시 한번 풀어봐야겠다!!

 

일단 프로그래머스 게시판에서 100점 받은 고수의 코드이다!

#자릿수계산
def jari(n):
    count=1
    while(n>=10):
        n//=10
        count+=1
    return count
def solution(s):
    answer = 0
    var_count=[]    #[n개단위로잘랐을때][몇번째등장한반복]=반복횟수
    var_len=[len(s)]      #[n개단위로잘랐을때]=길이
    for i in range(1,len(s)//2+1):
        var_continue=False  #연속하는지
        var_temp_left=0     
        var_temp_right=0
        var_count.append([])
        for j in range(len(s)//i-1):
            if(s[i*j:i*(j+1)]==s[i*(j+1):i*(j+2)]):
                if(var_continue):
                    var_count[i-1][len(var_count[i-1])-1]+=1
                else:
                    var_count[i-1].append(2)
                    var_continue=True
            else:
                var_continue=False
        for j in var_count[i-1]:
            var_temp_left+=j            #생략되어지는문자길이
            var_temp_right+=i+jari(j)   #표시해야하는문자길이=자른문자길이+반복횟수
        var_len.append(len(s)-var_temp_left*i+var_temp_right)   #길이=전체길이-생략길이+표시길이
    answer=min(var_len)
    return answer

 

프로그래머스의 진짜 창의적인 코드

def compress(text, tok_len):
    words = [text[i:i+tok_len] for i in range(0, len(text), tok_len)]
    res = []
    cur_word = words[0]
    cur_cnt = 1
    for a, b in zip(words, words[1:] + ['']):
        if a == b:
            cur_cnt += 1
        else:
            res.append([cur_word, cur_cnt])
            cur_word = b
            cur_cnt = 1
    return sum(len(word) + (len(str(cnt)) if cnt > 1 else 0) for word, cnt in res)

def solution(text):
    return min(compress(text, tok_len) for tok_len in list(range(1, int(len(text)/2) + 1)) + [len(text)])

a = [
    "aabbaccc",
    "ababcdcdababcdcd",
    "abcabcdede",
    "abcabcabcabcdededededede",
    "xababcdcdababcdcd",

    'aaaaaa',
]

for x in a:
    print(solution(x))
반응형