백준

백준 1305 - Java

으엉어엉 2024. 11. 4. 22:52
728x90

 

import java.util.Scanner;

public class BJ1305 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int length = sc.nextInt();
        String input = sc.next();
        sc.close();

        System.out.println(length - getPrefixTable(input, length));
    }

    private static int getPrefixTable(String input, int length) {
        int[] prefixTable = new int[length];
        int j = 0;

        for (int i = 1; i < length; i++) {
            while (j > 0 && input.charAt(i) != input.charAt(j)) {
                j = prefixTable[j - 1];
            }
            if (input.charAt(i) == input.charAt(j)) {
                prefixTable[i] = ++j;
            }
        }
        return prefixTable[length - 1];
    }
}

 

  • L: 문자열의 길이를 나타내는 정수
  • s: 주어진 문자열:
  • 결과는 L - makeTable(s, L)로, 전체 문자열 길이 L에서 가장 긴 접두사-접미사의 길이를 뺀 값을 출력
  • KMP 테이블 생성 함수
    • 이 함수는 KMP 알고리즘의 실패 함수(table)을 생성
    • table[i]는 길이 i+1인 문자열의 접미사와 접두사가 동일한 최대 길이를 저장
    • j는 접두사와 접미사의 길이를 추적한다
  • 동작 과정:
    • 문자열을 탐색하면서 처음과 끝이 일치하는 최대 길이를 계산한다
    • 만약 두 문자가 일치하지 않으면 j를 table[j - 1]로 업데이트하여 일치하는 접두사 길이를 줄이고, 일치하는 경우 j를 증가시키고 table[i]를 업데이트한다.
  • 출력 계산:
    • L - table[L - 1]은 전체 문자열 길이에서 가장 긴 접두사-접미사 길이를 빼, 중복을 제거한 최소 배너 길이를 구하면 된다.

 

728x90

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

백준 12865 - Java  (0) 2024.11.05
백준 9655 - Java  (0) 2024.11.05
백준 1904 - Java  (1) 2024.11.04
백준 1476 - Java  (0) 2024.11.02
백준 18111-Java  (0) 2024.11.01