쾌락없는 책임 (공부)/알고리즘 문제풀이
[Algorithm] 백준 5052 전화번호 목록 - C++, 트라이
허스크
2023. 10. 7. 19:44
반응형
5052번: 전화번호 목록
첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가
www.acmicpc.net
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Trie
{
bool bIsTerminal;
Trie* Children[10];
Trie()
: bIsTerminal(false), Children()
{}
~Trie()
{
delete [] Children;
}
void Insert(const string& InputNumber)
{
Trie* CurTrie = this;
for(int i = 0; i < InputNumber.size(); i++)
{
if(CurTrie->Children[InputNumber[i] - '0'] == nullptr)
{
CurTrie->Children[InputNumber[i] - '0'] = new Trie();
}
CurTrie = CurTrie->Children[InputNumber[i] - '0'];
if(i == InputNumber.size() - 1)
{
CurTrie->bIsTerminal = true;
}
}
}
bool IsTherePrefix(const string& InputNumber)
{
Trie* CurTrie = this;
for(int i = 0; i < InputNumber.size(); i++)
{
if(CurTrie->Children[InputNumber[i] - '0'] != nullptr)
{
CurTrie = CurTrie->Children[InputNumber[i] - '0'];
if(CurTrie->bIsTerminal)
{
return true;
}
}
else
{
return false;
}
}
return false;
}
};
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int TestCaseNum, PhoneNumberCount;
cin >> TestCaseNum;
while (TestCaseNum--)
{
cin >> PhoneNumberCount;
vector<string> NumberList(PhoneNumberCount);
for(int i = 0; i < PhoneNumberCount; i++)
{
cin >> NumberList[i];
}
sort(NumberList.begin(), NumberList.end());
Trie* NumberTrie = new Trie();
bool bNotConsistency = true;
for(auto PhoneNumber : NumberList)
{
if(NumberTrie->IsTherePrefix(PhoneNumber))
{
bNotConsistency = false;
break;
}
NumberTrie->Insert(PhoneNumber);
}
if(bNotConsistency)
{
cout << "YES\n";
}
else
{
cout << "NO\n";
}
delete NumberTrie;
}
}
시간적 여유가 생겨 새 알고리즘을 공부한 결과입니다. 트라이라는 자료구조를 처음 알게 되었기에 다른 자료들을 많이 참고하면서 풀이를 했습니다.
반응형