수학과의 좌충우돌 프로그래밍

[C++] BAEKJOON 5052번 전화번호목록 본문

알고리즘/C++

[C++] BAEKJOON 5052번 전화번호목록

ssung.k 2019. 8. 26. 23:01
 

5052번: 전화번호 목록

문제 전화번호 목록이 주어진다. 이때, 이 목록이 일관성이 있는지 없는지를 구하는 프로그램을 작성하시오. 전화번호 목록이 일관성을 유지하려면, 한 번호가 다른 번호의 접두어인 경우가 없어야 한다. 예를 들어, 전화번호 목록이 아래와 같은 경우를 생각해보자 긴급전화: 911 상근: 97 625 999 선영: 91 12 54 26 이 경우에 선영이에게 전화를 걸 수 있는 방법이 없다. 전화기를 들고 선영이 번호의 처음 세 자리를 누르는 순간 바로 긴급전화가

www.acmicpc.net

 

Trie 자료구조를 사용하는 문제였습니다.

Trie 자료구조란?

 

[Algorithm] Trie 자료구조

KMP 알고리즘 에 이어서 문자열에서 검색에 위한 새로운 방법들을 알아보도록 하겠습니다. 이번에 알아볼 내용은 Trie 자료구조입니다. Trie 자료구조 문자열 집합, {AB, ACD, ACEF, ACEG, HB, HC} 에 대해 Trie..

ssungkang.tistory.com

#include <iostream>
#include <cstdio>

using namespace std;

struct Phone {
    char tel[10];
};

struct Trie {
    bool finish;
    Trie *next[10];

    Trie() :finish(false){
        for (int i=0;i<10;i++)
            next[i] = 0;
    }
    ~Trie(){
        for (int i=0;i<10;i++)
            if (next[i]) delete next[i];
    }

    void insert(char *key){
        if (*key == '\0') finish = true;
        else {
            int cur = *key - '0';
            if (next[cur] == NULL){
                next[cur] = new Trie();
            }
            next[cur]->insert(key+1);
        }
    }

    bool find(char *key){
        if (*key == '\0') return false;
        if (finish) return true;
        int cur = *key - '0';
        return next[cur]->find(key+1);
    }
};

int main(int argc, const char * argv[]) {

    int T;
    cin >> T;
    for (int t=0;t<T;t++){
        int n;
        cin >> n;

        Phone data[10001] = {0,};

        for (int i=0;i<n;i++){
            cin >> data[i].tel;
        }

        int flag = 0;
        Trie *root = new Trie();
        for (int i=0;i<n;i++)
            root->insert(data[i].tel);

        for (int i=0;i<n;i++){
            if (root->find(data[i].tel)){
                flag = 1;
                break;
            }
        }

        if (flag) cout << "NO" << "\n";
        else cout << "YES" << "\n";
    }


    return 0;
}

 

Comments