백준/Java

[백준 1786] 찾기 - JAVA

SH3542 2024. 6. 21. 23:08

BOJ Link

 

풀이 과정

스탠다드한 KMP 문제이다.  문제 또한 KMP의 기본 개념을 그대로 설명하고 있다.

 

헤맨 부분

반례 하나를 고려하지 못해서 오답이 있었다.

 

input :

ABABA

ABA

 

answer :

2

1 3

 

wrong answer :

1

1

 

해당 문자열에서 ABA라는 문자열은 idx 0~2에 위치한다.

탐색 이후 idx 3번부터 재탐색을 하게 되면, idx 2~4에 위치한 케이스를 고려하지 못한다.

 

이후 수정하여 정답을 받았다.

 

제출 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String parent = br.readLine();
        String pattern = br.readLine();

        int n = parent.length();
        int m = pattern.length();

        int[] table = new int[m];

        int j = 0;
        for (int i = 1; i < m; i++) {

            while (j > 0 && pattern.charAt(i) != pattern.charAt(j)) {
                j = table[j - 1];
            }

            if (pattern.charAt(i) == pattern.charAt(j)) {
                j++;
                table[i] = j;
            }
        }

        j = 0;
        int matchCnt = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            while (j > 0 && parent.charAt(i) != pattern.charAt(j)) {
                j = table[j - 1];
            }

            if (parent.charAt(i) == pattern.charAt(j)) {
                j++;

                // j는 0 ~ m-1까지 비교한다.
                if (j == m) {
                    matchCnt++;
                    // 문제에서 idx=0은 1번째 문자이므로 +1
                    sb.append(i - (j - 1) + 1).append(" ");
                    j = table[j - 1];
                }
            }
        }

        System.out.println(matchCnt);
        System.out.println(sb);
    }
}

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

[백준 1036] 36진수 - JAVA  (0) 2024.06.26
[백준 1082] 방 번호 - JAVA  (0) 2024.06.22
[백준 1005] ACM Craft - JAVA  (0) 2024.06.20
[백준 12851] 숨바꼭질 2 - JAVA  (1) 2024.06.14
[백준 1495] 기타리스트 - JAVA  (1) 2024.06.12