[BOJ] 1701 Cubeditor
๋ฌธ์
๋ฌธ์ ์ค๋ช
Baekjoon Online Judge - 1701๋ฒ Cubeditor
Cubelover๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด Whitespace์ ์ฝ๋ฉ์ ๋์์ฃผ๋ ์ธ์ด์ธ Cubelang์ ๋ง๋ค์๋ค. Cubelang์ ์ด์ฉํด ์ฝ๋ฉ์ ํ๋ค๋ณด๋, ์ ์ ์ด ์ธ์ด์ ๋ง๋ ์๋ก์ด ์๋ํฐ๊ฐ ํ์ํ๊ฒ ๋์๋ค. ์ค๋ ์๊ฐ ๊ณ ์ํ ๋์ ์๋ก์ด ์๋ํฐ๋ฅผ ๋ง๋ค๊ฒ ๋์๊ณ , ๊ทธ ์๋ํฐ์ ์ด๋ฆ์ Cubeditor์ด๋ค.
ํ ์คํธ ์๋ํฐ๋ ์ฐพ๊ธฐ ๊ธฐ๋ฅ์ ์ง์ํ๋ค. ๋๋ถ๋ถ์ ์๋ํฐ๋ ์ฐพ์ผ๋ ค๊ณ ํ๋ ๋ฌธ์์ด์ด ๋จ ํ ๋ฒ๋ง ๋์๋ ์ฐพ๋๋ค. Cubelover๋ ์ด ๊ธฐ๋ฅ์ Cubelang์ ๋ถ์ ํฉํ๋ค๊ณ ์๊ฐํ๋ค. Cubelang์์ ํ์ํ ๊ธฐ๋ฅ์ ์ด๋ค ๋ฌธ์์ด ๋ด์์ ๋ถ๋ถ ๋ฌธ์์ด์ด ๋ ๋ฒ ์ด์ ๋์ค๋ ๋ฌธ์์ด์ ์ฐพ๋ ๊ธฐ๋ฅ์ด๋ค. ์ด๋, ๋ ๋ถ๋ถ ๋ฌธ์์ด์ ๊ฒน์ณ๋ ๋๋ค.
์๋ฅผ ๋ค์ด, abcdabc์์ abc๋ ๋ ๋ฒ ๋์ค๊ธฐ ๋๋ฌธ์ ๊ฒ์์ด ๊ฐ๋ฅํ์ง๋ง, abcd๋ ํ ๋ฒ ๋์ค๊ธฐ ๋๋ฌธ์ ๊ฒ์์ด ๋์ง๋ฅผ ์๋๋ค.
์ด๋ ๊ฒ ์ด๋ค ๋ฌธ์์ด์์ ๋ ๋ฒ ์ด์ ๋์ค๋ ๋ถ๋ถ ๋ฌธ์์ด์ ๋งค์ฐ ๋ง์ ์๋ ์๋ค. ์ด๋ฌํ ๋ถ๋ถ ๋ฌธ์์ด ์ค์์ ๊ฐ์ฅ ๊ธธ์ด๊ฐ ๊ธด ๊ฒ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์๋ฅผ ๋ค์ด, abcabcabc์์ abc๋ ์ธ ๋ฒ ๋์ค๊ธฐ ๋๋ฌธ์ ๊ฒ์ํ ์ ์๋ค. ๋, abcabc๋ ๋ ๋ฒ ๋์ค๊ธฐ ๋๋ฌธ์ ๊ฒ์ํ ์ ์๋ค. ํ์ง๋ง, abcabca๋ ํ ๋ฒ ๋์ค๊ธฐ ๋๋ฌธ์ ๊ฒ์ํ ์ ์๋ค. ๋ฐ๋ผ์, ๋ ๋ฒ ์ด์ ๋์ค๋ ๋ถ๋ถ ๋ฌธ์์ด ์ค์์ ๊ฐ์ฅ ๊ธด ๊ฒ์ abcabc์ด๊ธฐ ๋๋ฌธ์, ์ด ๋ฌธ์์ด์ด ๋ต์ด ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ๋ฌธ์์ด์ ๊ธธ์ด๋ ์ต๋ 5,000์ด๊ณ , ๋ฌธ์์ด์ ๋ชจ๋ ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
์ถ๋ ฅ
์ ๋ ฅ์์ ์ฃผ์ด์ง ๋ฌธ์์ด์ ๋ ๋ฒ์ด์ ๋์ค๋ ๋ถ๋ถ๋ฌธ์์ด ์ค์์ ๊ฐ์ฅ ๊ธด ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
ํด์ค
๋ฌธ์์ด์ ๋ชจ๋ ๊ฐ๋ฅํ ์๋ธ ๋ฌธ์์ด์ ๋ํด KMP ์๋ํ์ฌ ์ผ์นํ๋ ๋ฌธ์์ด ๊ธธ์ด์ ์ต๋๊ฐ์ ๊ตฌํ๋ค.
KMP์์๋ ๋ฌธ์์ด์ 0๋ฒ์งธ ์ธ๋ฑ์ค๋ถํฐ ์ ๋์ฌ๋ก ์ค์ ํ์ฌ ๋ฌธ์์ด ์ผ์น ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ฏ๋ก, ์๋ธ ๋ฌธ์์ด์ ์๋ณธ ๋ฌธ์์ด์ ๋งจ ์์์๋ถํฐ ๋ฌธ์ ํ๋์ฉ ์ง์๊ฐ๋ฉฐ ๊ตฌ์ฑํด์ผ ํ๋ค.
์ํ์ฐฉ์ค
์ด๋ฏธ ๋ฑ์ฅํ ์ ์๋ ๋ฌธ์๊ฐ ๋ ๋ฑ์ฅํ๋ค๋ฉด ์์ ๋ฑ์ฅํ ์ง์ ๋ถํฐ ํ์ฌ๊น์ง์ ๋ฌธ์์ด์ด, ๋ฐ๋ณต๋๋ ์๋ธ ๋ฌธ์์ด์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐ.
๋ฐ๋ผ์ ์ด๋ฌํ ๋ฌธ์์ด๋ค๋ง ๋ฆฌ์คํธ์ ๋ด์ KMP๋ฅผ ์๋ํ๋๋ฐ ๋๊ฐ์ง ๋ฌธ์ ๊ฐ ์์์.
- ์ผ์นํ๋ ๋ถ๋ถ์ด ์๊ธฐ ์์ ์ด ๋ผ์ด์ ธ ๋์จ ๋ฐ๋ก ๊ทธ ์์น๋ผ๋ฉด ์ค๋ณต๋๋ ๊ฒ์ด ์๋
- ์ผ์นํ๋ ๋ถ๋ถ์ด ํต์งธ๋ก ์ผ์นํ์ง ์๊ณ ์ผ๋ถ ์ผ์นํ๋ ๊ฒฝ์ฐ ์ฒดํฌ๊ฐ ์ด๋ ค์
๋ฐ๋ผ์ ์คํจโฆ
์ฝ๋
import java.io.*;
public class BOJ_1701_Cubeditor {
static String str;
static char[] subChars;
static int strLen, subLen, maxLen;
static int[] returnPointer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
str = br.readLine();
strLen = str.length();
findSubStrs();
System.out.println(maxLen);
}
private static void findSubStrs() {
for (int i=0; i<strLen-1; i++) {
subChars = str.substring(i, strLen).toCharArray();
subLen = subChars.length;
returnPointer = new int[subLen];
makeReturnPointerArr(i);
}
}
private static void makeReturnPointerArr(int s) {
for (int i=1, j=0; i<subLen; i++) {
while (j>0 && subChars[i]!=subChars[j]) j = returnPointer[j-1];
if (subChars[i]==subChars[j]) {
returnPointer[i] = ++j;
maxLen = Math.max(maxLen, j);
}
}
}
}
๐ก
- ๋ญ๊ฐ ์ํ์ฐฉ์ค๋ก ์คํจํ ๋ก์ง ์ ๊ตฌํํ๋ฉด ํต๊ณผํ ์๋ ์์ ๊ฒ ๊ฐ์๋ฐ,, ๋ค์ ๋์ ํด๋ด์ผ ๊ฒ ๋ค.