티스토리 뷰

이 문제는 트라이를 이용하면 풀 수 있다

여태까지 항상 동적 트라이만 짜봤는데 오늘 정적 트라이을 배워서 사용해봤다

 

먼저 문자열배열 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] = truereturn;
        }
        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 = truereturn;
        }
        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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함