본문 바로가기

삼성전자 알고리즘/백준온라인

7. 5052 전화번호 목록

원본 출처 : https://www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

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

www.acmicpc.net

문제 풀이 : 

#include <stdio.h>
#include <malloc.h>
#define NUM(X) ((X)-'0')
typedef struct _node {
    int last;
    struct _node *next[10];
}NODE;
NODE root;
int N;
void insert_node(NODE *p, char *str) {
    //int i;
    //NODE *cur = p;
 
    //for (i = 0; i < str[i]; i++) {
    //  NODE *newNode = calloc(1, sizeof(NODE));
    //  int t;
    //  t = (int)str[i] - 48;
    //  if (cur == &root) {
    //      //char 1 = int 49
    //      newNode->last = 1;
    //      cur->next[t] = newNode;
    //  }
    //  else {
    //      while (cur->next[t] != NULL) {
    //          cur->last = 0;
    //          cur = cur->next[t];
    //      }
    //      newNode->last = 1;
    //      cur->next[t] = newNode;
    //  }
    //}
    int i, n;
    NODE *new;
    for (i = 0; str[i]; i++) {
        n = NUM(str[i]);    //정수화
        if (p->next[n] == 0) {
            new = calloc(1, sizeof(NODE));
            p->next[n] = new;
        }
        p = p->next[n];
    }
    p->last = 1;
}
int search_node(NODE *p, char *str) {
    int i, n;
    NODE *new;
    for (i = 0; str[i]; i++) {
        n = NUM(str[i]);                //정수화
        if (p->last) return 1;           //기존문자열이 먼저 끝나면 현문자열이 일부분임
        if (p->next[n] == 0) return 0;   //내문자가 없다면 일부분 아님
        p = p->next[n];
    }
    if (p->last == 0) return 1;
    else return 0;
}
void delete_node(NODE *p) {
    int i;
    for (i = 0; i < 10; i++) {
        if (p->next[i]) {
            delete_node(p->next[i]);
            free(p->next[i]);
            p->next[i] = 0;
        }
    }
}
int main() {
    int ti, T;
    scanf("%d", &T);
    while (T--) {
        int i, flag = 0;
        char str[21];
        scanf("%d", &N);
        for (i = 0; i < N; i++) {
            scanf("%s", str);
            if (i != 0)flag |= search_node(&root, str);
            insert_node(&root, str);
        }
        if (flag) printf("NO\n");
        else printf("YES\n");
        delete_node(&root);
    }
    return 0;
}

'삼성전자 알고리즘 > 백준온라인' 카테고리의 다른 글

6. 3653 영화 수집  (0) 2019.06.28
5. 10755 컴퓨터실  (0) 2019.06.28
4. 11066 파일 합치기 [힙]  (0) 2019.06.16
3. 2805 나무 자르기  (0) 2019.06.16
2. 2961 도영이가 만든 맛있는 음식  (0) 2019.05.09