실버 5
#include<stdio.h>
int find_ring(int count, char s[], char ring[]) {
int s_len = 0;
while (1) {
if (s[s_len] == '\0' || s[s_len] == '\n')
break;
s_len++;
}
int i, j,n;
for (i = 0, j = 0,n=0; n < s_len+10; i++) {
if (ring[i % 10] == s[j]) {
j++;
if (j == s_len)
break;
}
else {
j = 0;
i = ++n;
}
}
if (s_len == j)
return ++count;
else return count;
}
int main() {
int count, num;
char s[11];
char ring[11];
count = 0;
scanf("%s", s);
scanf("%d", &num);
for (int k = 0; k < num; k++) {
scanf("%s", ring);
count = find_ring(count, s, ring);
}
printf("%d", count);
}
반례를 찾는 과정이 어려웠다...,
반지의 리스트를 선형이 아닌 순환 구조로 찾아야 했다.
ababc문자열을 찾을 경우
adadadc라면 인식을 못해 문제가 됐었다.
그래서 조금 시간이 오래 걸리더라도 반지의 인덱스 0~9, 1~-1,,,,로 하나씩 대조하여 찾도록 하였고
그러한 이유에서 반복문의 실행 횟수를 (현재 반지의 인덱스< 찾고자하는 문자열의 길이+10) 으로 설정하였다.
>>방금 알아낸 사실인데 n<11로 하는 것이 더 나은 방법이다,, s_len을 더한것은 의미가 없는 덧셈이엿군..
아무튼 fing_ring 함수에선 찾고자하는 문자열의 길이를 먼저 저장한 다음 ,j가 그 길이가 되었을 때, 즉 찾고자하는 문자열의 끝까지 검사를 실행하게 되었고 검사가 성공했을때 루프를 탈출하거나 아닌경우 루프를 탈출하지 못해 count의 반환 값이 달라지도록 하였다.