티스토리 뷰
이 문제는 트라이를 이용하면 풀 수 있다
여태까지 항상 동적 트라이만 짜봤는데 오늘 정적 트라이을 배워서 사용해봤다
먼저 문자열배열 s와 trie배열 그리고 문자열의 끝남을 알리는 fin을 잡자
trie가 [10000*10][10] 크기인 이유는 총 10000*10개의 정점이 나올 수 있고
각 정점은 0~9까지 10개의 숫자를 가질 수 있기 때문이다!
총 2가지의함수 insert, find를 구현했다!
insert에서는 문자열을 trie자료구조에 넣는다
이 때 문자열의 문자 하나씩을 보며 끝난다면 fin[현재정점]을 true로 만들어준다
그럼 우리는 현재정점은 끝나는 지점이라는 것을 알 수 있다
trie배열에는 trie[현재정점][현재문자] = cnt로 인덱스를 매긴다
그럼 문자열을 하나하나 찾을때 정점을 타고들어가서 다음 문자로 갈 수 있고
fin 배열을 이용해 끝나는지도 확인 할 수 있다
만약 현재 trie[idx][curr]에 값이 있다면 바꾸지 말고 그대로 넘어간다~!
그래야 미리 만들어둔 문자열의 길을 망가뜨리지않고 계속 이어나갈 수 있다!
find에서는 문자열을 훑어보며 중간에 끝나는 지점이 있는지 보면 된다
단순하게 fin[idx]가 true 라면 ans=true로 바꿔주고 함수를 끝내자
아니라면 현재 숫자를 curr에 넣고 idx = trid[idx][curr]로 다음 문자로 넘어간다!
이렇게 하나하나 찾아가면서 보면 정적트라이로 답을 찾을 수 있다!
소스코드
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
|
#include <iostream>
using namespace std;
const int N = 10010, M = 11;
int t, n,cnt=1;
char s[N][M];
int trie[N * M][M];
bool fin[N * M],ans;
void insert(int idx, int pos) {
for (int i = 0; i < M; i++) {
if (s[pos][i] == '\0') {
fin[idx] = true; return;
}
int curr = s[pos][i] - '0';
if (!trie[idx][curr]) trie[idx][curr] = cnt++;
idx = trie[idx][curr];
}
}
void find(int idx, int pos) {
for (int i = 0; i < M; i++) {
if (s[pos][i] == '\0') return;
if (fin[idx]) {
ans = true; return;
}
int curr = s[pos][i] - '0';
idx = trie[idx][curr];
}
}
int main() {
scanf(" %d", &t);
while (t--) {
for (int i = 0; i <= cnt; i++) {
fin[i] = false;
for (int j = 0; j < 11; j++) trie[i][j] = 0;
}
cnt = 1;
scanf(" %d", &n);
for (int i = 0; i < n; i++) {
scanf(" %s", &s[i]);
insert(0, i);
}
ans = false;
for (int i = 0; i < n; i++) find(0, i);
if (ans) puts("NO");
else puts("YES");
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
'알고리즘 > BOJ' 카테고리의 다른 글
[백준] 16434 드래곤 앤 던전 (0) | 2019.09.19 |
---|---|
[백준] 16432 떡장수와 호랑이 (0) | 2019.09.19 |
[백준] 2751 수 정렬하기 2 (0) | 2019.09.02 |
[백준] 1911 흙길 보수하기 (0) | 2019.08.27 |
[백준] 1781 컵라면 (0) | 2019.08.27 |
댓글