Programming/Algorithm
[Algorithm] Brute Force Method
gyu0
2020. 11. 23. 06:29
def bf_match(txt:str, pat:str)->int:
pt=0
pp=0
#일단 텍스트를 따라가는 pt와
#패턴을 따라가는 pp 를 0으로 초기화 했습니다.
while pt!=len(txt) and pp!=len(pat):
#그리고 pt가 텍스트크기를 다 탐색하거나
#패턴커서가 패턴의 크기를 다 탐색했을경우
#while문을 종료합니다.
if txt[pt]==pat[pp]:
pt+=1
pp+=1
#만약 텍스트커서와 패턴에 있는 커서를 비교해서
#둘이 일치할경우 커서를 이동해도 문제가 없다!
#그리고 다음 비교를 수행합니다.
else:
pt=pt-pp+1
pp=0
#일치하지 않을 경우에는
#여기서는 텍스트나 패턴의 문자를 다 탐색하지 않을경우니까
# 패턴 문자열이 탐색이 다 되지 않을 경우
# 이 경우는 중간에 다르다는 판별을 받았으므로
# 패턴이 커서가 0으로 초기화가 되었고
# 텍스트를 따라가는 커서는 패턴과 맞았던 위치까지만 빼주고 +1 하면
# 재탐색할 문자 인덱스를 줍니다. 그러면 텍스트 커서는 거기에 위치하고
# pp는 다시 0으로 되어서 그 텍스트커서부터 같이 카운트하며 비교합니다.
return pt - pp if pp==len(pat) else -1
#그래서 pp가 패턴탐색을 다했을 때는 찾았다는 뜻이니까
#pp와 같이 최대 끝까지 탐색된 pt는 그 최대 pt에서 pp를 빼주게 되면 그 인덱스가 나옵니다.
#ex) 0 1 2 3 4 5 6 7 <- pt
# 0 1 2<-pp
#7-2=5 이런식으로
if __name__=='__main__':
s1=input('텍스트를 입력하세요.: ')
s2=input('패턴을 입력하세요.: ')
idx=bf_match(s1, s2)
if idx==-1:#위에서 못찾았을때 -1 리턴
print('텍스트 안에 패턴이 존재하지 않습니다.')
else:
print(f'{(idx + 1)}번째 문자에서 일치합니다.')
브루트 포스는 인덱스를 거쳐가면서 한 회차에서 맞지 않는 패턴을 발견시 다시 패턴인덱스를 0으로 초기화 한 후에
해당변수[pt]를 적절하게 이동시키면서 다시 비교하는 알고리즘 입니다.
참고 : 자료구조와 함께 배우는 알고리즘 입문 브루트 포스편