반응형

문제 링크: https://www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

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

www.acmicpc.net

<문제 풀이> 트라이(trie)

 

트라이를 사용하여 전화번호를 삽입합니다. 삽입할 때마다, 트라이 내에 전화번호의 접두사가 이미 존재하는지 확인해야 합니다.

이를 구현하기 위해서는 find 함수에서 각 노드의 자식 노드의 존재 여부와 전화번호의 끝을 체크해야 합니다.

 

 

<C++소스코드>

 
#include<iostream>
#include<cstring>
using namespace std;

class Trie {
public:
	static const int MX = 10000 * 10;
	static const int ROOT = 1;
	int unused = 2;
	int nxt[MX + 1][10];
	bool check[MX + 1];

	Trie() {
		memset(nxt, 0xff, sizeof(nxt));
		memset(check, 0x00, sizeof(check));
	}
	void insert(const string &s) {
		int cur = ROOT;
		for (auto& c : s) {
			if (nxt[cur][c - '0'] == -1) nxt[cur][c - '0'] = unused++;
			cur = nxt[cur][c - '0'];
		}
		check[cur] = true;
	}
	bool find(const string& s) {
		int cur = ROOT;
		for (auto& c : s) {
			cur = nxt[cur][c - '0'];
			if (cur == -1) return false;
			else if (check[cur]) return true;
		}
		return true;
	}
};

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	int test_case; cin >> test_case;
	while (test_case--) {
		int n; cin >> n;
		string ans = "YES";
		Trie *trie = new Trie();
		for (int i = 0; i < n; i ++) {
			string num; cin >> num;
			if (trie->find(num)) ans = "NO";
			trie->insert(num);
		}
		cout << ans << '\n';
	}

	return 0;
}
반응형

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1719번] 택배  (1) 2023.10.16
[백준 14426번] 접두사 찾기  (1) 2023.10.04
[백준 10217번] KCM Travel  (1) 2023.10.04
[백준 1948번] 임계경로  (1) 2023.10.04
[백준 24042번] 횡단보도  (1) 2023.10.04

+ Recent posts