원본 출처 : 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 |