백준의 전화번호 목록(5052) 문제이다.
[ 문제 바로가기 ]
[ 문제풀이 ]
주어진 전화번호를 입력할 때, 일관성이 있는지 없는지 판단해야 하는 문제이다.
먼저, 본인은 전화번호를 "문자열"이라 생각하고 이 전화번호를 자료구조 트라이(TRIE)로 관리해주었다.
글을 읽기 전에, 트라이에 대해서 잘 모른다면 아래의 글을 읽고 오도록 하자.
위의 글에서 설명한것과 같이, 입력되는 전화번호들을 먼저 트라이로 관리하기 위해서 트라이에 입력해주었다.
트라이에서 관리하는 멤버변수로는 해당 문자가 마지막 문자임을 알 수 있게 표시해주는 'Finish' 변수와, 노드를 생성
하기 위한 TRIE *형 배열, 이 2개의 멤버변수를 만들어서 관리해주었다.
트라이에 등록한 이후에, 순차적으로 전화번호를 찾는데, 아직 전화번호가 끝이 나질 않았는데, 마지막 문자라고 표시되어
있는 경우에는 그대로 "NO"를 출력해주었다.
예를 들어서 [ 911234 , 911 ] 이 입력되어 있을 때, 911234를 트라이에서 하나씩 찾아가는 경우를 보면
"911" 이라는 번호 때문에 9 → 1 → 1 까지 갔을 때, Finish변수에 표시가 되어 있을 것이다. 이는, 911234에 전화를 걸지
못한다는 것이므로 일관성이 없다고 판단할 수 있다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include<iostream> #include<string> #define endl "\n" #define LEN_MAX 11 #define N_MAX 10010 #define NODE_MAX N_MAX * LEN_MAX using namespace std; struct TRIE { bool Finish; TRIE *Node[LEN_MAX]; void Insert(char *Str); bool Call(char *Str); }; int N, N_Idx; char Phone[N_MAX][LEN_MAX]; string Answer; TRIE *Root, Nodepool[NODE_MAX]; TRIE *Nodeset() { TRIE *NewNode = &Nodepool[N_Idx++]; NewNode->Finish = false; for (int i = 0; i < LEN_MAX; i++) NewNode->Node[i] = NULL; return NewNode; } void TRIE::Insert(char *Str) { if (*Str == NULL) { Finish = true; return; } int Cur = *Str - '0'; if (Node[Cur] == NULL) Node[Cur] = Nodeset(); Node[Cur]->Insert(Str + 1); } bool TRIE::Call(char *Str) { if (*Str == NULL) return true; if (Finish == true) return false; int Cur = *Str - '0'; return Node[Cur]->Call(Str + 1); } void Initialize() { N_Idx = 0; Root = Nodeset(); } void Input() { cin >> N; for (int i = 0; i < N; i++) cin >> Phone[i]; } void Solution() { for (int i = 0; i < N; i++) Root->Insert(Phone[i]); bool Flag = true; for (int i = 0; i < N; i++) { if (Flag == true) Flag = Root->Call(Phone[i]); if (Flag == false) break; } if (Flag == true) Answer = "YES"; else Answer = "NO"; } void Solve() { int Tc; cin >> Tc; for (int T = 1; T <= Tc; T++) { Initialize(); Input(); Solution(); cout << Answer << endl; } } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 15659 ] 연산자 끼워넣기(3) (C++) (0) | 2020.03.25 |
---|---|
[ 백준 12094 ] 2048 (Hard) (C++) (0) | 2020.03.24 |
[ 백준 11286 ] 절대값 힙 (C++) (0) | 2020.03.21 |
[ 백준 11779 ] 최소비용 구하기2 (C++) (0) | 2020.03.19 |
[ 백준 9370 ] 미확인 도착지 (C++) (0) | 2020.03.17 |