ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/BOJ] 5555번 : 반지 _C언어
    알고리즘/백준(BOJ) 2022. 2. 4. 20:00
    728x90
    반응형
    https://www.acmicpc.net/problem/5555

     

     

    >접근방법

    (방법1)

       문자열이 같아지는 부분의 인덱스를 변수에 저장하고 그 부분부터 문자열 끝까지 다 맞으면 count 를 더해준다. 다르면 반복문을 나와 다시 검사한다. 문제에서 반지는 처음과 끝이 연결되어 있기 때문에 끝에서 처음으로 문자열이 연결되어있는 경우를 생각해서 조건문을 설정했다. 문자열 최대 길이가 10이기 때문에 10 - '문자열길이' 가 j 보다 작을 경우 j를 0으로 보내준다.

     

    (방법2)

       찾으려는 문자열이 반지의 끝과 처음의 경계에 걸쳐있을 경우를 생각해서 반지 문자열을 두 줄로 복사해서 새 배열에 담는다(예. "ABCXXYYYYY" -> "ABCXXYYYYYABCXXYYYYY"). 그 배열을 반복문으로 문자열이 있는지 검사한다. 이때 문자열 검색 함수인 strstr()함수를 이용한다.

     

     

     

     

    >알고리즘

    (방법1)

       1. 입력 문자열 개수만큼 첫 번째 for문 반복

       2. 문자열의 첫 문자가 같아지는 인덱스를 j에 저장

       3. strRing[j]부터 나머지 문자열도 같으면 count 증가

       4. 예외1) 반지의 경계에 문자열이 걸쳐있을 경우의 if문을 추가한다.

       5. 예외2) 문자열의 중간부분까지만 같은 경우의 if문을 추가한다.

     

    (방법2)

       1. 입력받은 문자열 반지 배열을 두 줄로 복사 예) "ABCXXYYYYY" -> "ABCXXYYYYYABCXXYYYYY"

       2. strstr함수 이용

       3. 문자열 있으면 count 증가

     

     

    >코드

    (방법1) - 오류

    #include <stdio.h>
    #include <string.h>
    
    char str[50];
    int num, i, j, k; //j: 같은문자 시작 인덱스, K: 문자열 전체 같은지 검사
    char strRing[50];
    int count=0;
    
    int main(void){
        scanf("%s", str);
        scanf("%d", &num);
        int len = strlen(str);
    
        for(i=0; i<num; i++){
    
            scanf("%s", strRing); //반지
            j=0;
            for(; strRing[j] != str[0]; j++){
    
            }
    
            for(k=0; k<len; k++){ //str 길이만큼 반복
    
                if(j>(10-len) && j == 10){ // 문자열이 경계에 걸쳐 있을 때
                    j=0;
                    k--;
                }
                else if(strRing[j] == str[k]){
                    j++;
                }
                else{
                    k=0;
                }
            }
    
            if(len==k){
                count++;
            }
        }
    
        printf("%d\n", count);
        return 0;
    }

    미완성 코드.. 언젠가는 꼭 완성시켜야지

     

    (방법2)

    #include <stdio.h>
    #include <string.h>
    // 알고리즘
    /*
        1. 입력받은 문자열 복사
        2. strstr함수로 문자열 확인
    */
    
    char str[50];
    char strRing2[50];
    int num, i, j;
    char strRing[50];
    int count=0;
    
    int main(void){
        printf("시작");
    
        scanf("%s", str);
        scanf("%d", &num);
    
        for(i=0; i<num; i++){
    
            scanf("%s", strRing);
    
            int lenRing = strlen(strRing);
            for(j = 0; j<lenRing; j++){
                strRing2[j] = strRing[j];
                strRing2[j+10] = strRing[j];
            }
            char* ptr = strstr(strRing2, str);
            if(ptr != NULL){
                count++;
            }
        }
        printf("%d\n", count);
        return 0;
    }

     

     

    >결과

     

     

    >결론 

    <string.h> 라이브러리에 strstr() 이라는 문자열을 검색해주는 좋은 함수가 있었다.

    같은 문제는 이틀까지만 생각하기로 했는데 3일이나 써버렸다. 결국 해결해서 기분은 좋다만, 다음부턴 문제를 놓아주는 법을 좀 배워야겠다.

    오늘의 교훈: 머리가 나쁘면 몸이 고생한다. 앞으로는 적당한 함수가 있는지 먼저 알아보고 알고리즘을 짜자.

    LIST
Designed by Tistory.