문제
https://school.programmers.co.kr/learn/courses/30/lessons/17685#
아이디어1
Trie 구조를 사용
class trie {
public:
trie()
{
}
~trie()
{
for (auto& c : child)
{
delete c.second;
}
child.clear();
}
private:
unordered_map<char, trie*> child;
int count = 0;
};
아이디어2
주어진 단어들을 통해 노드를 생성
void insert(string word)
{
trie* cur = this;
for (int i = 0; i < word.size(); ++i)
{
char key = word.at(i);
auto iter = cur->child.find(key);
if (iter != cur->child.end())
{
cur = iter->second;
}
else
{
trie* temp = new trie;
cur->child.emplace(key, temp);
cur = temp;
}
cur->count++;
}
}
아이디어3
Trie 구조에서 DFS를 통해 카운트가 1이 나올 때까지 카운트를 더하면 총 입력해야하는 횟수
void sol(int& answer)
{
answer += count;
if (count == 1)
{
return;
}
for (auto c : child)
{
c.second->sol(answer);
}
}
int solution(vector<string> words) {
int answer = 0;
trie root;
for (string word : words)
{
root.insert(word);
}
root.sol(answer);
return answer;
}
마무리
- 처음에 생성할 때 word를 넘겨주면서 key를 만들고 나머지를 넘겨주면서 생성하니 string을 계속 복사해서 테스트 케이스22에서 시간 초과가 나옴
- word를 한 번만 받아와서 쭉 생성하는 방식으로 바꿈
- 다른 사람의 코드가 더 느릴 수 밖에 없었는데 내 코드가 더 시간이 걸리길래 확인해보니 할당 해제에 대한 시간이 추가 됨
- 그래도 delete는 해주자