백준 5052번

2021. 1. 10. 01:55Algorithm/문제풀이

www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가

www.acmicpc.net

해당 문제는 크게 어렵지는 않았다. trie의 특성을 이용해서 쉽게해결할 수 있다. 우선 문제를 해결하려면 현재의 온전한 문자를 접두사로 사용하는 곳이 있는지 체크해주어야한다. 트라이의 특성을 이용해 이 값을 다 찾으 다음 다음 후보군 노드 중에 NULL이 아닌 값이 있으면 해당 문자가 접두사로 이용되고 있음을 뜻한다. 

 

아래 그림을 보면 간단할 것이다. 

911을 찾을 때 911까지 찾은 후 다음 노드가 있는지 0 ~ 9까지 반복을 통해 체크해주었다. 

 

정답

더보기
#include <cstdio>
#include <string.h>
#include <string>
#include <algorithm>
#include <vector>
int testCase;

using namespace std;

void solve();
int toIndex(char num){
	return num - '0';
}

typedef struct TrieNode{
	bool isTerminal;
	TrieNode *children[11];

	TrieNode():isTerminal(false){
		memset(children, 0, sizeof(children));
	}

	~TrieNode(){
		for(int i = 0; i < 10; i++)
			if(children[i] != NULL)
				delete children[i];
	}

	void insert(char *words){
		if(*words == 0)
			isTerminal = true;
		else{
			int next = toIndex(*words);

			if(children[next] == NULL)
				children[next] = new TrieNode();

			children[next]->insert(words+1);
		}
	}

	int find(const char *words){
		int next = toIndex(*words);
		if(*(words+1) == 0){
			for(int i = 0; i < 10; i++)
				if(children[next]->children[i] != NULL){
					return 1;
				}

				return 0;
		}else
			return children[next]->find(words+1);
	}
}Trie;

int main(){
	scanf("%d", &testCase);

	for(int i = 0; i < testCase; i++){
		solve();
	}
}

void solve(){
	int N;
	char words[12];
	vector<string> wordsSet;
	scanf("%d", &N);

	TrieNode* root = new TrieNode();

	for(int i = 0; i < N; i++){
		scanf("%s", &words);
		root->insert(words);
		wordsSet.push_back(string(words));
	}

	sort(wordsSet.begin(), wordsSet.end());
	

	for(int i = 0; i < N; i++){
		if(root->find(wordsSet[i].c_str())){
			printf("NO\n");
			return ;
		}		
	}
	printf("YES\n");
}

 

'Algorithm > 문제풀이' 카테고리의 다른 글

백준 10896 나머지합  (0) 2021.01.13
백준 13305 주유소  (0) 2021.01.10
백준 1644 소수의 연속합  (0) 2020.07.19
백준 2437 저울  (0) 2020.07.18
백준 1786 - 찾기  (0) 2020.07.18