본문 바로가기

백준

찾기 - KMP 알고리즘

728x90

<참고>

www.youtube.com/watch?v=UcjK_k5PLHI

m.blog.naver.com/PostView.nhn?blogId=rokey_89&logNo=221497982117&proxyReferer=https:%2F%2Fwww.google.com%2F

 

백준 1786 : 찾기 (JAVA) KMP알고리즘

해당 문제는 https://www.acmicpc.net/problem/1786 를 참고하시기 바랍니다!간단하게 문제를 요약하면 K...

blog.naver.com

www.acmicpc.net/problem/1786

 

1786번: 찾기

첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 공백으로 구분해 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m

www.acmicpc.net

package String;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;

// 백준 찾기
public class Find {


    public static int[] getPi(String pattern){ //패턴 찾기
        int len = pattern.length();
        int []pi = new int[len];
        int j=0;
        for(int i=1; i<len; i++){
            while(j>0 && pattern.charAt(i)!= pattern.charAt(j)){
                j = pi[j-1];
            }
            if(pattern.charAt(i)==pattern.charAt(j)){
                pi[i]=++j;
            }
        }

        return pi;
    }

    public static ArrayList<Integer>KMP(String str, String pattern){
        ArrayList<Integer> list = new ArrayList<>();
        int [] pi = getPi(pattern);
        int len = str.length();
        int plen = pattern.length();
        int j =0;

        for(int i=0; i<len; i++){
            while(j>0 && str.charAt(i)!=pattern.charAt(j)) {
                j = pi[j - 1];
            }
            if(str.charAt(i)==pattern.charAt(j)){
                if(j==plen-1){
                    list.add(i-plen+1);
                    j = pi[j];
                }else{
                    j++;
                }
            }
        }
        return list;
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String target = br.readLine();
        String tofind = br.readLine();

        ArrayList<Integer> list = KMP(target, tofind);  //KMP 함수의 반환값 저장
        int size = list.size();                          // 찾은 패턴이 몇개인지 저장할 변수
        System.out.println(size);                        // 찾은 패턴의 개수 출력

        for(int i=0; i<size; i++) {                      // List의 size만큼 해당 인덱스를 출력한다
            System.out.print(list.get(i)+1+" ");
        }


    }

}

'백준' 카테고리의 다른 글

쿼드트리-1992번 (Java)  (0) 2021.08.22
Z - 1074번 (Java)  (0) 2021.08.22
이중우선순위큐  (0) 2021.04.05
인구이동  (0) 2021.01.25