[알고리즘 정리] KMP(3/3)

최대 1 분 소요

이전 포스트에서 pi 배열을 구해봤습니다. 이제 텍스트에서 pi 배열을 사용해 패턴을 찾아냅니다.

http://dl.dropbox.com/s/t7xufieqo4r5khe/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-1.png

패턴을 찾아내는 과정은 pi 배열을 만드는 과정과 똑같습니다. 다만, i가 1부터 시작하는 것이 문자열의 시작인 0부터 시작합니다.

http://dl.dropbox.com/s/szf62ep6z3jnfvn/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-2.png


http://dl.dropbox.com/s/siqi74cvjt1ybyw/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-3.png


http://dl.dropbox.com/s/41e1xolb9099e4s/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-4.png


http://dl.dropbox.com/s/d8o3eaqlf5wa7jx/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-5.png


http://dl.dropbox.com/s/ck1igpr6xusca9n/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-6.png


http://dl.dropbox.com/s/al39sv53cly30iq/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-7.png


http://dl.dropbox.com/s/0ir3bkz8hgk794f/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-8.png


http://dl.dropbox.com/s/11jvy36g4l8g3f1/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-9.png


http://dl.dropbox.com/s/uzmzdv1wdwf93il/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-10.png


http://dl.dropbox.com/s/6fzhbj3ruc707qn/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-11.png

j가 패턴 길이의 끝에 도착하면, 패턴이 발견된 것입니다. 문자열 순회가 아직 끝나지 않았으므로, 패턴이 발견된 이후부터 다시 검사를 시작합니다. 이 때, pi[j] 는 1이므로, 인덱스 1부터 새로 검사를 시작하면 됩니다.

http://dl.dropbox.com/s/jp2jlfebybz79q7/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-12.png


http://dl.dropbox.com/s/vh65z9q2uf63cx5/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-13.png


http://dl.dropbox.com/s/l2snfvwdatxt0h4/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-14.png


http://dl.dropbox.com/s/zy95gxves60stjr/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-15.png


http://dl.dropbox.com/s/5bd0g85m767fr6t/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-16.png


http://dl.dropbox.com/s/d93szhchre2i8ki/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-17.png


http://dl.dropbox.com/s/4ecc9vymeyzgidw/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-18.png


http://dl.dropbox.com/s/lecncdhvm4dzj1b/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-19.png


http://dl.dropbox.com/s/5xcydimxkplz7xg/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-20.png


http://dl.dropbox.com/s/43k5rpe36syq9qg/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-21.png


http://dl.dropbox.com/s/88zsy5yixch2vjm/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-22.png


http://dl.dropbox.com/s/r12uo0ylxp69m2a/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-23.png


http://dl.dropbox.com/s/8kah07jegvdb3ct/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-24.png


http://dl.dropbox.com/s/krn44uevpw2ryqx/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%20%EC%A0%95%EB%A6%AC-KMP%203-25.png

아래 함수는 위의 패턴 매칭 과정을 구현한 코드입니다.

static void KMP(String text, String patttern) {
	int[] pi = getPi(pattern);
	char[] orgin = text.toCharArray();
	char[] pt = pattern.toCharArray();

	int j = 0;
	for (int i = 0; i < text.length(); i++) {
		while (j > 0 && origin[i] != pt[j]) {
			j = pi[j - 1];
		}

		if(origin[i] == pt[i]) {
			if (j == pattern.length() - 1) {
				// 패턴을 찾았습니다. 여기서 검출 작업을 합니다.
				j = pi[j]; // 다음 매칭을 검사하기 위해서 j는 마지막 부분으로 돌아갑니다.
			}
			else {
				j++;
			}
		}
	}
}

카테고리:

업데이트:

댓글남기기