마라톤에 참여한 선수들의 이름과, 완주에 성공한 사람들의 이름들이 주어집니다. 처음에 트라이에 마라톤에 참여한 선수들의 이름을 넣으려 했는데 이러면 완주에 성공하지 못한 선수의 이름을 찾기 위해 순회를 한번 더 해야한다는 생각이 들어서 완주에 성공한 사람들의 이름들을 통해 트라이를 구성하고 참여한 사람들의 이름을 하나씩 대입하여 찾는 방식으로 진행했습니다.

완벽히 코드를 작성했다고 생각했지만 계속 틀려서 시간이 좀 걸렸는데, 그 이유는 동명이인이 3명이 생길 수 있다는 사실을 간과했기 때문입니다. 따라서 trie를 구성할때 terminal을 bool 형이 아닌 int 형으로 두어서 동명이인을 카운트 하는 방식으로 진행했습니다.

#include <iostream>
#include <vector>

int to_number(char ch)
{
	return (ch - 'a');
}

struct Trie
{
	std::vector<Trie *>children;
	int terminal;
	Trie(): terminal(false)
	{
		children.resize(26, nullptr);
	}
	~Trie()
	{
		for (size_t i = 0 ; i < 26 ; i++)
			if (children[i])
				delete children[i];
	}

	void insert(std::string &key, int i)
	{
		if (key[i] == '\\0')
			terminal++;
		else
		{
			int next = to_number(key[i]);
			if (children[next] == nullptr)
				children[next] = new Trie();
			children[next] -> insert(key, i+1);
		}
	}

	Trie* find(std::string &key, int i)
	{
		if (key[i] == '\\0')
		{
			if (!terminal)
				return (nullptr);
			terminal--;
			return (this);
		}
		int next = to_number(key[i]);
		if (children[next] == nullptr)
			return (nullptr);
		return (children[next]->find(key, i+1));
	}
};

std::string solution(std::vector<std::string> participant, std::vector<std::string> completion)
{
	Trie *p = new Trie();
	std::string answer = "";
	for (size_t i = 0 ; i < completion.size() ; i++)
		p->insert(completion[i], 0);
	for (size_t i = 0 ; i < participant.size(); i++)
		if (!p->find(participant[i], 0) && participant.size() != 1)
		{
			answer = participant[i];
			break;
		}
	delete p;
	return (answer);
}