본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1786 찾기

by 까망 하르방 2021. 2. 22.
반응형

출처: https://www.acmicpc.net/problem/1786

Approach

[문자열] KMP 알고리즘을 이용하여 해결할 수 있다.

 

[문자열] KMP 알고리즘

KMP 알고리즘이란? 『KMP 알고리즘』 문자열을 검색할 때, 불필요한 반복을 줄이기 위해 검색 문자열의 접두사와 접미사의 중복 길이를 이용한 알고리즘 입니다. (※ Knuth–Morris–Pratt algorithm, KMP)

zoosso.tistory.com


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
 
 
public class Main {
     
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
         
        char[] text = br.readLine().toCharArray();
        char[] pattern = br.readLine().toCharArray();
         
        List<Integer> answer = KMP(text, pattern);
         
        bw.write(answer.size() + "\n");
        for(int i=0; i<answer.size(); i++) {
            bw.write(answer.get(i) + "\n");
        }
 
        bw.flush(); bw.close();
    }
 
    private static List<Integer> KMP(char[] text, char[] pattern) {
        int[] table = makeTable(pattern);
        int textSize = text.length;
        int patternSize = pattern.length;
         
        // 매칭되는 인덱스 위치
        List<Integer> matchingIndexArr = new ArrayList<Integer>(); 
         
        int j = 0;
        for(int i=0; i<textSize; i++) {
            while(j > 0 && text[i] != pattern[j]) {
                j = table[j-1];
            }
            if(text[i] == pattern[j]) {
                // 패턴 매칭 성공
                if(j == patternSize - 1) {
                    // 매칭되는 인덱스 저장
                    matchingIndexArr.add(i - patternSize + 2);
                    j = table[j];
                }
                else {
                    j++;
                }
            }
        }
        return matchingIndexArr;
    }
 
    private static int[] makeTable(char[] pattern) {
        int patternSize = pattern.length;
        int[] table = new int[patternSize];
         
        int j = 0;
        for(int i=1; i<patternSize; i++) {
            while(j>0 && pattern[i] != pattern[j]) {
                j = table[j-1];
            }
            if(pattern[i] == pattern[j]) {
                table[i] = ++j;
            }
        }
        return table;
    }
}

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 4355 서로소  (0) 2021.02.22
[BOJ] 백준 17406 배열 돌리기 4  (0) 2021.02.22
[BOJ] 백준 1120 문자열  (0) 2021.02.22
[BOJ] 백준 14620 꽃길  (0) 2021.02.22
[BOJ] 백준 7569 토마토  (0) 2021.02.22

댓글