[S/W 문제해결 기본] 3일차 - String (D3)
문제 링크
- 주어진 문자열안에 타겟 문자열이 몇개있는지 찾는 문제
- 처음엔 그냥 브루트포스로 앞에서부터 확인하고 첫글자가 같으면 그 다음글자들이 같은지 확인했다
- 나중에 보이어무어 탐색으로 풀었는데, 구현하는데 거의 3시간 걸렸다,, 인덱스가 헷갈려서
- 보이어무어 설명하는 글은 나중에 작성해서 링크를 달아두겠다..
브루트포스 탐색
package swea;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class p1213 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int t = 1; t <= 10; t++) {
br.readLine();
String find = br.readLine();
char[] inputString = br.readLine().toCharArray();
int ans = 0;
for (int i = 0; i < inputString.length - find.length() + 1; i++) {
if (inputString[i] == find.charAt(0)) {
int same = 1;
for (int j = 1; j < find.length(); j++) {
if (inputString[i + j] != find.charAt(j)) {
same = 0;
break;
}
}
ans += same;
}
}
System.out.printf("#%d %d\n", t, ans);
}
}
}
보이어 무어 탐색
package swea;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class p1213_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int tc = 0; tc < 10; tc++) {
sc.next();
String f = sc.next();
String words = sc.next();
int M = f.length();
int N = words.length();
Map<Character, Integer> skip = makeSkip(f);
int idx = M - 1;
int sum = 0;
while (idx < N) {
boolean check = true;
for (int i = 0; i < M; i++) {
if (words.charAt(idx - i) != f.charAt(M - i - 1)) {
check = false;
if (!skip.containsKey(words.charAt(idx - i))) {
idx += M - i;
} else {
if (skip.get(words.charAt(idx - i)) - i > 0) {
idx += skip.get(words.charAt(idx - i)) - i;
} else
idx++;
}
break;
}
}
if (check) {
sum++;
idx++;
}
}
System.out.printf("#%d %d\n", tc + 1, sum);
}
}
public static Map<Character, Integer> makeSkip(String f) {
int M = f.length() - 1;
Map<Character, Integer> result = new HashMap<>();
for (int i = 0; i < f.length(); i++) {
result.put(f.charAt(i), M--);
}
return result;
}
}