Supersett
개발자의 하루
Supersett
Blockchain Dev
전체 방문자
오늘
어제
  • 분류 전체보기
    • 프론트
    • 회사생활
    • 블록체인
    • 프로젝트
      • 창업 프로젝트 (DRF + AWS)
      • Spring 프로젝트
    • [중앙대]멋쟁이 사자처럼
    • 기술서적
    • Problem Solving
      • 알고리즘
    • 일기장
      • 하루 정리
      • 삽질 일기
      • 조급할 때 눌러보기

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 디프만16기
  • 신입개발자
  • 니어프로토콜
  • 멋쟁이 사자처럼 서류
  • 면접준비
  • 해커톤
  • 글리치해커톤
  • 국비지원
  • 비트코인
  • 구글소셜로그인
  • 블록체인 서버설계
  • 멋쟁이사자처럼 중앙대
  • 자바
  • 국비
  • 취업준비
  • 멋쟁이 사자처럼 면접
  • 컴퓨터학원
  • Luniverse
  • Multichain API
  • 멋쟁이 사자처럼
  • Near Explorer
  • DEPROMEET
  • 멋사 중앙대
  • 블록체인정보가공
  • java
  • 자바스크립트
  • 프로젝트
  • Near Scan
  • 국비교육
  • 초보개발자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Supersett

개발자의 하루

Problem Solving/알고리즘

KMP 알고리즘 : 문자열 검색 알고리즘 (백준-16916)

2022. 6. 28. 13:22

 

▶N문자열에서 M문자열을 검색할 때?

가장 단순한 문자열 검색 : O(NM)

KMP 알고리즘 : O(N+M)

 

[PI 배열]

pi[i]는 주어진 문자열의 0~i 까지의 부분 문자열 중에서 prefix == suffix가 될 수 있는 부분 문자열 중에서 가장 긴 것의 길이

(이때 prefix가 0~i  까지의 부분 문자열과 같으면 안된다.)

 

[KMP 알고리즘]

- j-1번째 까지 탐색을 했는데 문자열이 일치 했고 j번째 문자열에서 i번째 문제열과 다를 경우

 -> 0~j-1번째 까지의 pi배열에서 패턴이 있는지 확인한다.

 -> 즉 pi[j-1]값이 있는지 확인(코드에서는-> j>0 이 부분)

     1,  k라는 값이 있다면 j는 k라는 값을 가지게 되고 j번째 문자열과 i번째 문자열을 비교한다!

       => 이 때 j가 0보다 큰데 s[i] 와 pattern[j]의 문자열이 같게되면 ? -> 0~j-1번쨰 까지는 문자열이 같기 때문에 비교할 필요 없다.

     2. 값이 0일 경우는 pattern의 0부터 다시 비교해야됨

def getPI(pattern):
    j = 0
    for i in range(1, len(pattern)):
        while j > 0 and pattern[i] != pattern[j]:
            j = pi[j - 1]
        if pattern[i] == pattern[j]:
            j += 1
            pi[i] = j

def KMP(s, pattern):
    getPI(pattern)
    j = 0
    for i in range(len(s)):
        while j > 0 and s[i] != pattern[j]:
            j = pi[j - 1]
        if s[i] == pattern[j]:
            if j == len(pattern) - 1:
                return True
            else:
                j += 1
    return False

s = input()
pattern = input()
pi = [0 for x in range(len(pattern))]

if KMP(s, pattern):
    print('1')
else:
    print('0')

 

 

[출처]

https://landlordgang.tistory.com/82

https://bowbowbow.tistory.com/6

 

 

 

 

 

 

'Problem Solving > 알고리즘' 카테고리의 다른 글

[백준] 1522 - 슬라이딩 윈도우  (0) 2022.06.30
[백준]1254 - 팰린드롬 만들기  (0) 2022.06.30
#브루트 포스 (Brute Force)  (0) 2022.05.17
#뭔가 코드를 짜면서 거창하다,이게 맞나? 느껴질 때  (0) 2022.05.11
#문자열 내에 원하는 문자열 포함여부 체크하는 방법  (0) 2022.05.09
    'Problem Solving/알고리즘' 카테고리의 다른 글
    • [백준] 1522 - 슬라이딩 윈도우
    • [백준]1254 - 팰린드롬 만들기
    • #브루트 포스 (Brute Force)
    • #뭔가 코드를 짜면서 거창하다,이게 맞나? 느껴질 때
    Supersett
    Supersett
    하루를 돌아보고 공부한 티를 내기 위해 블로그를 만들었습니다.

    티스토리툴바