1305 광고
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