ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 5052] 전화번호 목록
    백준/문자열 2024. 1. 10. 20:34

    트라이로 품

     

     

    그리고 정렬하고 트라이에 넣어야함

    왜냐하면 9114 911 이렇게 들어가면

    911 들어갈때 일관성 검사를 못하기 때문

     

    길이가 짧은 것부터 넣어야함

    그래야 일관성 검사가 가능

     


    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    typedef struct _Node {
    	struct _Node* childs[10] = { NULL, };
    	bool isWord = false;
    }Node;
    
    // 트라이 추가 함수
    bool insert(Node* root, string s) {
    	Node* cur = root;
    
    	int idx;
    	for (int i = 0; i < s.size(); i++) {
    		idx = s[i] - '0';
    
    		if (cur->childs[idx] == NULL) {
    			cur->childs[idx] = new Node();
    		}
    
    		cur = cur->childs[idx];
    
    		// 가던 길에 단어인 놈이 있으면 일관성 없는거임
    		if (cur->isWord) {
    			return false;
    		}
    	}
    
    	cur->isWord = true;
    
    	return true;
    }
    
    bool compare(string s1, string s2) {
    	return s1.size() < s2.size();
    }
    
    int main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0); cout.tie(0);
    
    	int T, N;
    	string s;
    
    	cin >> T;
    	for (int i = 0; i < T; i++) {
    		
    		Node* root = new Node();
    		vector<string> v;
    		cin >> N;
    		for (int k = 0; k < N; k++) {
    			cin >> s;
    			v.push_back(s);
    		}
    		
    		// 길이 작은 순으로 정렬
    		sort(v.begin(), v.end(), compare);
    
    		bool isCorrect = true;
    		for (int i = 0; i < v.size(); i++) {
    			isCorrect = insert(root, v[i]);
    			if (!isCorrect) break;
    		}
    
    		if (isCorrect) cout << "YES" << "\n";
    		else cout << "NO" << "\n";
    	}
    
    	return 0;
    }

     

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    typedef struct _Node {
    	struct _Node* childs[10] = { NULL, };
    	bool isWord = false;
    }Node;
    
    // 트라이 추가 함수
    void insert(Node* root, string s) {
    	Node* cur = root;
    
    	int idx;
    	for (int i = 0; i < s.size(); i++) {
    		idx = s[i] - '0';
    
    		if (cur->childs[idx] == NULL) {
    			cur->childs[idx] = new Node();
    		}
    
    		cur = cur->childs[idx];
    	}
    
    	cur->isWord = true;
    }
    
    // 중복 확인 함수
    bool check(Node* root, string s) {
    	Node* cur = root;
    
    	int idx;
    	for (int i = 0; i < s.size()-1; i++) {
    		idx = s[i] - '0';
    
    		cur = cur->childs[idx];
    
    		if (cur->isWord) return false;
    	}
    
    	return true;
    }
    
    int main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0); cout.tie(0);
    
    	int T, N;
    	string s;
    
    	cin >> T;
    	for (int i = 0; i < T; i++) {
    		
    		Node* root = new Node();
    		vector<string> v;
    		cin >> N;
    		for (int k = 0; k < N; k++) {
    			cin >> s;
    			v.push_back(s);
    			insert(root, s);
    		}
    
    		bool isCorrect = true;
    
    		for (int k = 0; k < N; k++) {
    			isCorrect = check(root, v[k]);
    			if (!isCorrect) break;
    		}
    
    		if (isCorrect) cout << "YES" << "\n";
    		else cout << "NO" << "\n";
    	}
    
    	return 0;
    }

    '백준 > 문자열' 카테고리의 다른 글

    [백준 6137] 문자열 생성  (0) 2024.02.23
    [백준 1316] 그룹 단어 체커  (0) 2024.02.23
    [백준 14426] 접두사 찾기  (0) 2024.01.10
    [백준 1283] 단축키 지정  (1) 2024.01.10
    [백준 2204] 도비의 난독증 테스트  (0) 2023.03.26