<aside>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> // malloc 사용을 위한 헤더 추가
//------------------- Naive ------------------//
#define MAX(a, b) ((a) > (b) ? (a) : (b))
void naivematch(char T[], int n, char P[], int m, int output[]) {
int i, j, k, kk;
for (i = 0; i < n; i++) {
output[i] = 0;
}
for (i = 0; i < n; i++) {
for (j = i, k = 0; k < m && j < n; j++, k++) {
if (T[j] != P[k])
break;
}
for (j = i, kk = 0; kk < k; j++, kk++) {
output[j] = MAX(output[j], kk + 1);
}
}
}
int main() {
char text[] = "abcabcabc";
char pattern[] = "abcd";
int n = strlen(text);
int m = strlen(pattern);
// 동적 할당
int* output = (int*)malloc(n * sizeof(int));
//text, text길이, 찾을 txt 문자 길이, 찾을 pattern 문자 길이
naivematch(text, n, pattern, m, output);
printf("Output array: ");
for (int i = 0; i < n; i++) {
printf("%d ", output[i]);
}
printf("\\n");
free(output); // 동적 할당 해제
return 0;
}
//--------------------------------------------//
</aside>
구조
for (i = 0; i < n; i++) {
for (j = i, k = 0; k < m && j < n; j++, k++) {
if (T[j] != P[k])
break;
}
for (j = i, kk = 0; kk < k; j++, kk++) {
output[j] = MAX(output[j], kk + 1);
}
}
1. 첫 번째 for문
-------------------
T = "abcabcabc"
P = "abc"
-----------------------------------------------
j k T[j] P[k] if (T[j] != P[k])
0 0 'a' 'a' ❌ (같음 → 계속)
1 1 'b' 'b' ❌ (같음 → 계속)
2 2 'c' 'c' ❌ (같음 → 계속)
3 3 'a' X ✅ (P에 더 비교할 글자 없음 → break;)
-----------------------------------------------
2. 두 번째 for문
-------------------
output[0] = MAX(output[0], 1)
output[1] = MAX(output[1], 2)
output[2] = MAX(output[2], 3)
-----------------------------
=> output = [1, 2, 3, 0, 0, 0, 0, 0, 0]
3. i = 1, i = 2
---------
b != a
c != a
---------
=> braek
4. i = 3
---------
j k T[j] P[k] if (T[j] != P[k])
3 0 'a' 'a' ❌ (같음 → 계속)
4 1 'b' 'b' ❌ (같음 → 계속)
5 2 'c' 'c' ❌ (같음 → 계속)
6 3 'a' X ✅ (P에 더 비교할 글자 없음 → break;)
----------------------------------------------
=> 5번 부터 2번과 동일