백준/kmp

1305 광고

have a good time 2022. 6. 18. 22:47

 

 

1. 풀이

 

다른 블로그를 참고했다.

 

kmp 알고리즘에는 주어진 문자열의 

부분 문자열 중 접두사와 접미사가 같은 최대 길이를 나타내는 배열을 구한다.

나는 이를 value 배열이라고 표현했다.

 

이 문제에서 나온

문자열 aabaaa의 value 배열은

[0, 1, 0, 1, 2, 2] 이다.

 

kmp 알고리즘에 대해 자세히 알고 싶다면 다음 내용을 살펴보면 된다.

 

https://happy-fun.tistory.com/253

 

1786 찾기

1. kmp 알고리즘 문자열 검색 알고리즘(kmp) 에 대해 먼저 자세하게 설명하겠다. 1) 예제 예를 들어 설명하겠다. 문자열 all : ABCDABCDABEF 문자열 part : ABCDABE 가 있을때, all 에 part 문자열이 있는지 확인.

happy-fun.tistory.com

 

 

그렇다면 이 문제의 정답은 L - value[L-1] 을 구하면 된다.

 

그 이유를 설명해 보겠다.

 

전광판에 나타나는 aabaaa에서

원래 광고하고 싶은 내용은 aaba 이다.

 

즉, aaba 에 aa가 붙었다.

그리고 aa는 원래 문자 aaba의 맨 앞부분이다.

 

즉 aa 가 원래 문자 aaba 앞 부분과 같기 때문에  

이 두 문자가 합쳐진 

aabaaa 에서 접두사와 접미사가 같은 부분이 생겨나게 되고,

이 부분을 나타내는 게 value[L-1] 이다.

 

value[L-1] = value[5] = 2 

즉, 원래 문자열에서 덧붙여진 문자 길이 2를 value[5] 가 나타내고 있다.

 

그렇기 때문에 전광판에 나타나는 문자(aabaaa)의 길이 L 에서

value[L-1] 을 빼면 되는 것이다.

 

문제에 나온 예제

aaaaa는,

 

원래 문자 a에 aaaa가 붙어서

최종 문자 aaaaa에서 

접두사와 접미사가 같은 부분이 aaaa로,

길이가 4이고

5 - 4 = 1 이 된다.

 

 

 

2. 최종 코드

 

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

public class Main {

	static int value[];
	static int L;
	static String input;
	
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		L = Integer.parseInt(br.readLine());
		input = br.readLine();
		value = new int[L];
		makeValue();
		System.out.println(L-value[L-1]);
		
	}
	
	
	
	public static void makeValue() {
		
		int index = 0;
		
		for(int i = 1; i<L ; i++) {
			
			while(index >0 && input.charAt(i)!= input.charAt(index)) {
				index = value[index-1];
			}
			
			if(input.charAt(i)== input.charAt(index)) {
				index++;
				value[i] = index;
			}
			
		}
	}
}

 

참고 블로그 : 

https://hi-spring-night.tistory.com/21

 

[백준] 1305. 광고(JAVA)

https://www.acmicpc.net/problem/1305 1305번: 광고 세준이는 길 한가운데에서 전광판을 쳐다보고 있었다. 전광판에는 광고가 흘러나오고 있었다. 한참을 전광판을 쳐다본 세준이는 이 광고가 의미하는 것

hi-spring-night.tistory.com