반응형
    
    
    
  
해당 문제는 프로그래머스 코딩테스트 연습에 있는 문제입니다.
아래 링크를 통해 풀 수 있습니다.
https://programmers.co.kr/learn/courses/30/lessons/17685
자동완성
포털 다음에서 검색어 자동완성 기능을 넣고 싶은 라이언은 한 번 입력된 문자열을 학습해서 다음 입력 때 활용하고 싶어 졌다. 예를 들어, go 가 한 번 입력되었다면, 다음 사용자는 g 만 입력해도 go를 추천해주므로 o를 입력할 필요가 없어진다! 단, 학습에 사용된 단어들 중 앞부분이 같은 경우에는 어쩔 수 없이 다른 문자가 나올 때까지 입력을 해야 한다.
효과가 얼마나 좋을지 알고 싶은 라이언은 학습된 단어들을 찾을 때 몇 글자를 입력해야 하는지 궁금해졌다.
예를 들어, 학습된 단어들이 아래와 같을 때
go gone guild - go를 찾을 때- go를 모두 입력해야 한다.
- gone을 찾을 때- gon까지 입력해야 한다. (- gon이 입력되기 전까지는- go인지- gone인지 확신할 수 없다.)
- guild를 찾을 때는- gu까지만 입력하면- guild가 완성된다.
이 경우 총 입력해야 할 문자의 수는 7이다.
라이언을 도와 위와 같이 문자열이 입력으로 주어지면 학습을 시킨 후, 학습된 단어들을 순서대로 찾을 때 몇 개의 문자를 입력하면 되는지 계산하는 프로그램을 만들어보자.
입력 형식
학습과 검색에 사용될 중복 없는 단어 N개가 주어진다.
모든 단어는 알파벳 소문자로 구성되며 단어의 수 N과 단어들의 길이의 총합 L의 범위는 다음과 같다.
- 2 <= N<= 100,000
- 2 <= L<= 1,000,000
출력 형식
단어를 찾을 때 입력해야 할 총 문자수를 리턴한다.
입출력 예제
| words | result | 
|---|---|
| [ go, gone, guild] | 7 | 
| [ abc, def, ghi, jklm] | 4 | 
| [ word, war, warrior, world] | 15 | 
입출력 설명
- 첫 번째 예제는 본문 설명과 같다.
- 두 번째 예제에서는 모든 단어들이 공통된 부분이 없으므로, 가장 앞글자만 입력하면 된다.
- 세 번째 예제는 총 15자를 입력해야 하고 설명은 아래와 같다.- word는- word모두 입력해야 한다.
- war는- war까지 모두 입력해야 한다.
- warrior는- warr까지만 입력하면 된다.
- world는- worl까지 입력해야 한다. (- word와 구분되어야 함을 명심하자)
 
트라이 알고리즘을 사용해서 쉽게 풀었습니다.
트라이 알고리즘은 제 블로그에서 자세히 설명해 놨으니 참고하시기 바랍니다.
https://hwan-shell.tistory.com/133
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class Trie {
private:
    Trie * child[26];
    int count[26]{};
    
public:
    Trie(){
        for(int i = 0; i < 26; i++)
            child[i] = NULL;
    }
    
    void insert(const char * c){
        if(*c == '\0') return;
        
        int next = *c - 'a';
        count[next]++;
        
        if(child[next] == NULL){
            child[next] = new Trie();
            child[next]->insert(c + 1);
        }else
            child[next]->insert(c + 1);  
    }
    
    int find(const char * c, int num){
        if(*c == '\0') return num - 1;
        
        int next = *c - 'a';
        
        if(count[next] == 1) return num;
        
        return child[next]->find(c + 1, num + 1);      
    }
};
int solution(vector<string> words) {
    int answer = 0;
    Trie t;
    for(int i = 0; i < words.size(); i++)
        t.insert(words[i].c_str());
    for(int i = 0; i < words.size(); i++)
        answer += t.find(words[i].c_str(), 1);
    
    return answer;
}
반응형
    
    
    
  '코딩테스트 > 프로그래머스' 카테고리의 다른 글
| 프로그래머스] C++ 2018 KAKAO BLIND RECRUITMENT - [1차] 비밀지도(Level 1) (0) | 2020.04.30 | 
|---|---|
| 프로그래머스] C++ 2018 KAKAO BLIND RECRUITMENT - [1차] 뉴스 쿨러스터링(Level 2) (0) | 2020.04.30 | 
| 프로그래머스] C++ 2019 카카오 인턴십 - 호텔 방 배정(Level 4) (0) | 2020.04.25 | 
| 프로그래머스] C++ 2019 카카오 인턴십 - 징검다리 건너기(Level 3) (0) | 2020.04.25 | 
| 프로그래머스] C++ 2019 카카오 인턴십 - 불량사용자(Level 3) (0) | 2020.04.25 | 
댓글