Skip to content

Commit 1c73e0a

Browse files
committed
[String] baekjoon-1786 (KMP)
1 parent 194c6f7 commit 1c73e0a

File tree

4 files changed

+124
-0
lines changed

4 files changed

+124
-0
lines changed

Diff for: โ€ŽREADME.md

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
| :-: | :-: | :------------------------------------------------ | :--- |
2828
| 01 | | [Baekjoon-14425 ๋ฌธ์ž์—ด ์ง‘ํ•ฉ](./src/String/P14425) | |
2929
| 02 | | [Baekjoon-14426 ์ ‘๋‘์‚ฌ ์ฐพ๊ธฐ](./src/String/P14426) | |
30+
| 03 | | [Baekjoon-1786 ์ฐพ๊ธฐ](./src/String/P1786) | KMP |
3031

3132
## Data Structure
3233

Diff for: โ€Žsrc/String/P1786/Main.java

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package String.P1786;
2+
3+
import java.io.*;
4+
5+
public class Main {
6+
7+
static StringBuilder sb;
8+
9+
public static void main(String[] args) throws Exception {
10+
System.setIn(new FileInputStream("src/String/P1786/input.txt"));
11+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
12+
13+
String T = br.readLine();
14+
String P = br.readLine();
15+
16+
if (T.length() < P.length()) {
17+
System.out.println(0);
18+
} else {
19+
sb = new StringBuilder();
20+
System.out.println(kmp(T, P));
21+
System.out.println(sb.toString());
22+
}
23+
}
24+
25+
static int[] makePk(String P) {
26+
int[] Pk = new int[P.length()];
27+
int k = 0;
28+
for (int i = 1; i < P.length(); i++) {
29+
while (k > 0 && P.charAt(i) != P.charAt(k))
30+
k = Pk[k - 1];
31+
if (P.charAt(i) == P.charAt(k))
32+
Pk[i] = ++k;
33+
}
34+
return Pk;
35+
}
36+
37+
static int kmp(String T, String P) {
38+
int[] Pk = makePk(P);
39+
int p_idx = 0, count = 0;
40+
for (int i = 0; i < T.length(); i++) {
41+
while (p_idx > 0 && T.charAt(i) != P.charAt(p_idx))
42+
p_idx = Pk[p_idx - 1];
43+
if (T.charAt(i) == P.charAt(p_idx)) {
44+
if (p_idx == P.length() - 1) {
45+
p_idx = Pk[p_idx];
46+
count ++;
47+
sb.append(i - P.length() + 2).append("\n");
48+
} else {
49+
p_idx ++;
50+
}
51+
}
52+
}
53+
return count;
54+
}
55+
}

Diff for: โ€Žsrc/String/P1786/README.md

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
## [baekjoon-1786] ์ฐพ๊ธฐ
2+
3+
![image](https://user-images.githubusercontent.com/22045163/103164130-9df83000-484a-11eb-8bc5-fc126523863c.png)
4+
![image](https://user-images.githubusercontent.com/22045163/103164138-ae100f80-484a-11eb-835a-ecff93761a4d.png)
5+
6+
### KMP ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜
7+
8+
> [KMP : ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜](https://bowbowbow.tistory.com/6)
9+
10+
์œ„ ๋งํฌ์— ๋งค์šฐ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค. ์Šค์Šค๋กœ ๋ช‡ ๋ฒˆ ๋” ๊ตฌํ˜„ํ•ด๋ณด๋ฉด์„œ ์—ฐ์Šตํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.
11+
12+
### ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ด์Šˆ - makePk ํ•จ์ˆ˜
13+
14+
```java
15+
static int[] makePk(String P) {
16+
int[] Pk = new int[P.length()];
17+
for (int i = 1; i < P.length(); i++) {
18+
int k = (i+1) / 2;
19+
while (k > 0 && !P.substring(0, k).equals(P.substring(i+1 - k, i+1)))
20+
k--;
21+
Pk[i] = k;
22+
}
23+
return Pk;
24+
}
25+
```
26+
27+
์ฒ˜์Œ์—๋Š” ์ด๋ ‡๊ฒŒ ์งฐ์—ˆ๋‹ค. `substring`์„ ํ†ตํ•ด ์ผ์ผ์ด ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
28+
์งœ๋ฉด์„œ๋„ ์‹œ๊ฐ„ ๊ฑฑ์ •์„ ๋งŽ์ด ํ–ˆ์—ˆ๋Š”๋ฐ, ์—ญ์‹œ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ด์Šˆ๊ฐ€ ๋‚ฌ๋‹ค.
29+
์œ„ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด๋‹ˆ ์ด ํ•จ์ˆ˜๋„ kmp ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์›๋ฆฌ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
30+
๊ทธ๋žฌ์„ ๋•Œ O(`P์˜ ๊ธธ์ด`)๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
31+
32+
### ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„ ์ค„์ด๊ธฐ
33+
34+
![image](https://user-images.githubusercontent.com/22045163/103164190-5aea8c80-484b-11eb-828e-d7f197f7ce0e.png)
35+
36+
์ฒ˜์Œ์—๋Š” ArrayList์— ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
37+
ํ•˜์ง€๋งŒ ๊ทธ๋žฌ์„ ๋•Œ ์‹คํ–‰ ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์„ ์ฐธ๊ณ ํ•ด๋ณด์•˜๋‹ค.
38+
ArrayList ๋Œ€์‹ , StringBuilder์— ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋‹ˆ
39+
๋ฉ”๋ชจ๋ฆฌ์™€ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
40+
41+
ArrayList๋Š” ๋Œ€๋Ÿ‰์˜ ์ž๋ฃŒ๋ฅผ ์ถ”๊ฐ€ํ•  ์‹œ ๋ณต์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚จ๋‹ค๊ณ  ํ•œ๋‹ค.
42+
43+
> Java.util.ArrayList ์—์„œ add()๋‚˜ ensureCapicity() ๋ฅผ ํ˜ธ์ถœํ•˜์˜€์„ ๋•Œ
44+
> ๋งŒ์•ฝ ์ง€๊ธˆ ํ• ๋‹น๋œ ์˜์—ญ์ด ์ž‘๋‹ค๋ฉด, `(ํ˜„์žฌํฌ๊ธฐ*3/2+1)`๋งŒํผ์œผ๋กœ ์ƒˆ๋กœ ์˜์—ญ์„ ํ• ๋‹นํ•˜๊ณ  ์ „์ฒด ๋ณต์‚ฌ๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
45+
> Size๊ฐ€ ์ปค์ง€๋ฉด Arrays.copyOf() ๋‚ด๋ถ€์—์„œ ๋ณต์‚ฌํ•  ๋ถ€๋ถ„์ด ์ปค์ง‘๋‹ˆ๋‹ค.
46+
> ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜๋ฉด ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€์— ๋ถ€๋‹ด์ด ๋œ๋‹ค๋Š” ๋ง์ด์ง€์š”.
47+
>
48+
> ์ถœ์ฒ˜ : [Java ArrayList, Vector, LinkedList ์ž๋ฃŒํ˜• ๋น„๊ต (์‹œ๊ฐ„ ๋ณต์žก๋„ ์ค‘์‹ฌ์œผ๋กœ...) - ์‚ถ, ๊ธˆ์œต, IT, ์žก๋™์‚ฌ๋‹ˆ](https://pickykang.tistory.com/6)

Diff for: โ€Žsrc/String/P1786/input.txt

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
ABC ABCDAB ABCDABCDABDEABCDABD
2+
ABCDABD
3+
4+
ABABABABBABABABABC
5+
ABABABC
6+
7+
ABC ABCDAB ABCDABCDABDEABCDABD
8+
ABCDABD
9+
10+
ABCDABCDABDE
11+
ABCDAB
12+
13+
ABABABABBABABABABC
14+
012345678901234567
15+
ABABABABC
16+
012345678
17+
18+
ABCDABCDABDE
19+
ABCDAB
20+

0 commit comments

Comments
ย (0)