์ ๋งํฌ์ ๋งค์ฐ ์ ์ค๋ช ๋์ด ์๋ค. ์ค์ค๋ก ๋ช ๋ฒ ๋ ๊ตฌํํด๋ณด๋ฉด์ ์ฐ์ตํด์ผ ํ ๊ฒ ๊ฐ๋ค.
static int[] makePk(String P) {
int[] Pk = new int[P.length()];
for (int i = 1; i < P.length(); i++) {
int k = (i+1) / 2;
while (k > 0 && !P.substring(0, k).equals(P.substring(i+1 - k, i+1)))
k--;
Pk[i] = k;
}
return Pk;
}
์ฒ์์๋ ์ด๋ ๊ฒ ์งฐ์๋ค. substring
์ ํตํด ์ผ์ผ์ด ๋น๊ตํ๋ ๊ฒ์ด๋ค.
์ง๋ฉด์๋ ์๊ฐ ๊ฑฑ์ ์ ๋ง์ด ํ์๋๋ฐ, ์ญ์ ์๊ฐ ์ด๊ณผ ์ด์๊ฐ ๋ฌ๋ค.
์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด๋ณด๋ ์ด ํจ์๋ kmp ์๊ณ ๋ฆฌ์ฆ ์๋ฆฌ๋ฅผ ์ด์ฉํด์ผ ํ๋ ๊ฒ์ด์๋ค.
๊ทธ๋ฌ์ ๋ O(P์ ๊ธธ์ด
)๋ก ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋ค.
์ฒ์์๋ ArrayList์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์๋ค. ํ์ง๋ง ๊ทธ๋ฌ์ ๋ ์คํ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋๋ฌด ๋ง์ด ํ์ํ๋ค๋ ๊ฒ์ ํ์ธํ๊ณ ๋ค๋ฅธ ์ฝ๋๋ค์ ์ฐธ๊ณ ํด๋ณด์๋ค. ArrayList ๋์ , StringBuilder์ ๊ฐ์ ์ ์ฅํ์ฌ ๊ทธ๋๋ก ์ถ๋ ฅํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์๋ค.
ArrayList๋ ๋๋์ ์๋ฃ๋ฅผ ์ถ๊ฐํ ์ ๋ณต์ฌ๊ฐ ์ผ์ด๋๊ฒ ๋์ด ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํจ๋ค๊ณ ํ๋ค.
Java.util.ArrayList ์์ add()๋ ensureCapicity() ๋ฅผ ํธ์ถํ์์ ๋
๋ง์ฝ ์ง๊ธ ํ ๋น๋ ์์ญ์ด ์๋ค๋ฉด,(ํ์ฌํฌ๊ธฐ*3/2+1)
๋งํผ์ผ๋ก ์๋ก ์์ญ์ ํ ๋นํ๊ณ ์ ์ฒด ๋ณต์ฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
Size๊ฐ ์ปค์ง๋ฉด Arrays.copyOf() ๋ด๋ถ์์ ๋ณต์ฌํ ๋ถ๋ถ์ด ์ปค์ง๋๋ค.
๋ค๋ฅด๊ฒ ๋งํ๋ฉด ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์ฌ์ด์ฆ ์ฆ๊ฐ์ ๋ถ๋ด์ด ๋๋ค๋ ๋ง์ด์ง์.