초코레

브루트-포스법 본문

알고리즘

브루트-포스법

초코레 2020. 1. 1. 22:45
  • 문자열 검색의 기초 알고리즘
  • 브루트-포스법은 선형 검색을 확장한 알고리즘으로 단순법, 소박법이라고도 한다.
  • 이미 검사를 진행한 위치를 기억하지 못하므로 효율은 좋지 않다.
    • 다른 문자를 만나면 패턴에서 문자를 검사했던 위치 결과를 버리고 다음 텍스트의 위치로 1칸 이동한 다음 다시 패턴의 첫 번째 문자부터 검사한다.
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
//브루트-포스법으로 문자열을 검색
 
//여러 개라면 가장 앞쪽에 있는 인덱스 반환
static int bfMatch(String txt, String pat) {
    int pt = 0;            //텍스트를 스캔하는 변수
    int pp = 0;            //패턴을 스캔하는 변수
    
    while (pt != txt.length() && pp != pat.length()) {
        if (txt.charAt(pt) == pat.charAt(pp)) {
            pt++;
            pp++;
        } else {
            pt = pt - pp + 1;
            pp = 0;
        }
    }
    if (pp == pat.length()) {
        return pt - pp;        //검색 성공
    }
    return -1;                //검색 실패
}
 
//여러 개라면 가장 뒤쪽에 있는 인덱스 반환
static int bfMatchLast(String txt, String pat) {
    int pt = txt.length() - 1;
    int pp = pat.length() - 1;
    
    while (pt >= 0 && pp >= 0) {
        if (txt.charAt(pt) == pat.charAt(pp)) {
            pt--;
            pp--;
        } else {
            pt = pt + (pat.length() - pp) - 2;
            pp = pat.length() - 1;
        }
    }
    if (pp < 0) {
        return pt + 1;
    }
    return -1;
}
cs

'알고리즘' 카테고리의 다른 글

Boyer-Moore법  (0) 2020.01.01
KMP법  (0) 2020.01.01
집합  (0) 2019.12.31
도수 정렬  (0) 2019.12.30
힙 정렬(heap sort)  (0) 2019.12.29