【Algorithm】 [프머] 2018 KAKAO BLIND RECRUITMENT 자동완성

(Algo) [프머] 2018 KAKAO BLIND RECRUITMENT 자동완성

1. sort

a. 앞과 뒤 문자와 비교하기

def solution(words):
    answer = 0
    words.sort()
    
    
    for idx in [0, len(words)-1]:
        cases = -1 if idx > 0 else 1
        for order in range(len(words[idx])):
            try:
                if words[idx][order] == words[idx+cases][order]:
                    answer += 1
                else:
                    answer += 1
                    break
            except:
                answer += 1
                break
                
    
    for idx in range(1,len(words)-1):
        left = 0
        right = 0
        for order in range(len(words[idx])):
            try:
                if words[idx-1][order] == words[idx][order]:
                    left += 1
                else:
                    left += 1
                    break
            except:
                left += 1  
                break
        for order in range(len(words[idx])):
            try:
                if words[idx][order] == words[idx+1][order]:
                    right += 1
                else:
                    right += 1
                    break
            except:
                right += 1  
                break
        answer += max(left,right)
    return answer

b. 맨앞 알파벳부터 모든 단어 비교하기(나의 풀이)

img

def solution(words):    
    
    words.sort()
    
    # make zero vector
    counter_vector = []
    for i in range(len(words)):
        counter_vector.append([0 for j in range(len(words[i])+1)])
    
    # fill counter_vector
    word_stack = ['0']*MAX_COUNT
    for i in range(len(words)):
        fill_current_vector(i,words,counter_vector,word_stack)
    
    #print(counter_vector)

    # return answer
    answer = 0
    for i in range(len(words)):
        answer += sum(counter_vector[i])
    return answer




MAX_COUNT = 1000


def fill_current_vector(current_word,words,counter_vector,word_stack):
    while(1):
        current_step = counter_vector[current_word].index(0)
        word_stack[current_step] = words[current_word][current_step]
        
        for i in range(current_word,len(words)):
            if current_step > len(words[i])-1 : break
            if word_stack[current_step] == words[i][current_step] and counter_vector[i].index(0) == current_step :
                counter_vector[i][current_step] = 1
            else : break
        
        # break condition 1
        if counter_vector[current_word][-2] == 1 : break
        # break condition 2, 3
        if current_word == len(words)-1 : break
        else:
            if counter_vector[current_word+1][current_step] == 1 : pass
            else : break

2. Trie

Trie구조를 사용하기 위한 python 기본 지식cur = dict()ccur = {}cur[‘c’] = ‘value’ cur[‘c’] = {‘num’ :1}print(cur) » {‘c’: {‘num’: 1}}

a.

img

def solution(words):
    char_freq = {}
    for word in words:
        cur = char_freq
        for char in word:
            try:
                cur[char]['num'] += 1
            except:
                cur[char] = {'num':1}
            cur = cur[char]  # cursor 를 마지막에 갱신

    res = 0

    for word in words:
        cur = char_freq
        for char in word:
            res += 1
            if cur[char]['num'] == 1:
                break
            else:
                cur = cur[char]
    return res

b.

def solution(words):
    word_dict = build_dict(words)
    total_num = 0
    for word in words:
        for i in range(len(word)):
            if len(word_dict[word[:i+1]]) == 1:
                total_num += i + 1
                break
        else:
            total_num += len(word)
            
    return total_num

def build_dict(words):
    d = {}
    for word in words:
        for i in range(len(word)):
            if not d.get(word[:i+1]):
                d[word[:i+1]] = [word]
            else:
                d[word[:i+1]].append(word)
    return d

© All rights reserved By Junha Song.