5555

#include <stdio.h>
#include <string.h>

// 문자열 비교 함수
int str_cmp_f(char *str, char *cmp, int len){
    int s_index = 0;
    int c_index = 0;
    for(int x = 0; x < 20; x++){
        // 문자열이 같은 경우
        if(str[s_index] == cmp[c_index]){
            s_index++;
        }
        // 문자열이 다른 경우
        else{
            int index = 0;
            int y = 0;
            // 만약 2개 이상이 같을 경우
            if(!(s_index == 1)){
                // 2번째 부터 찾고자하는 문자열의 0번째와 같은 문자열 찾기
                // ex)
                // CCCBB
                // CBCCCCCBBA
                for(y ;y < s_index; y++){
                    if(str[0] == cmp[c_index-s_index+y+1]){
                        index = c_index-s_index+y;
                        break;
                    }
                }

                // 만약 0번째와 같은 문자열이 있을 경우
                if(index){
                    x -= s_index-y;
                    c_index = index;
                }
            }
            // 만약 1개만 같았을 경우 
            // ex)
            // DEBBGAKBC
            // DDEBBGAKBC
            else{
                c_index --;  
                x --;      
            }   
            s_index = 0;
            
        }

        c_index++;
        // 모든 문자열이 같은 경우
        if(s_index == len){
            return 1;
        }
        // x가 9일 경우 c_index를 0번째로 초기화
        // ex)
        // XYZ
        // ZAAAAAAAXY
        else if(x == 9){
            c_index = 0;
        }
    }

    // 모든 문자열이 같은 경우
    if(s_index == len){
        return 1;
    }
    // 모든 문자열이 같은 경우가 없을 경우
    else{
        return 0;
    }

}

int main(void){
    // 찾고자하는 문자열 입력
    char str[11] = {0};
    scanf("%s", &str);
    int len = strlen(str);

    // 반지 개수
    int ring_num = 0;
    scanf("%d", &ring_num);

    int count = 0;
    for(int i = 0; i < ring_num; i++){
        // 비교 할 문자열입력
        getchar();
        char cmp_str[11] = {0};
        scanf("%s", &cmp_str);

        // 찾고자하는 문자열이 포함 된지 count
        count += str_cmp_f(str, cmp_str,len);
    }

    // 찾고자하는 문자열을 포함 반지의 개수를 출력
    printf("%d", count);
    return 0;
}

ㅎㅎ.. 코드 더럽다 ㅎㅎ...


 

그래서 gpt 에게 코드 더럽다고 하니까 깔끔한 버전을 주더라구요...

#include <stdio.h>
#include <string.h>

int contains(char *pattern, char *ring) {
    char doubled[22];
    strcpy(doubled, ring);
    strcat(doubled, ring);   // 원형 처리

    return strstr(doubled, pattern) != NULL;
}

int main(void) {
    char pattern[11];
    scanf("%s", pattern);

    int n;
    scanf("%d", &n);

    int count = 0;
    for (int i = 0; i < n; i++) {
        char ring[11];
        scanf("%s", ring);

        count += contains(pattern, ring);
    }

    printf("%d\n", count);
    return 0;
}

.. 그 긴게 짧게 바뀌었어요........

strcpy()와 strcat() 함수를 사용해서

doubled = ZAAAAAAAXYZAAAAAAAXY << 이렇게 원형 처리를 하고

 

strstr() 함수로 doubled  안에 XYZ가 있는지 찾고 찾았다면 1 없다면 NULL이여서 0을 반환.... wow ㅎㅎ;;

그럼 코드 길이가 2444B 에서 521B로 ~~^^;;;;

+ Recent posts