PALINDROMIZE 문제 시간 자꾸 초과나네요 ㅠㅠ

  • Jinsanger
    Jinsanger

    안녕하세요. 팰린드롬 만들기 문제를 풀고 있는 알고리즘 초보입니다. ㅠㅠ
    계속 시간 초과 오류가 나는데 왜 그런지 정말 모르겠네요.
    문제에서 제한이 50개의 길이 10만 짜리 string 까지 걸려있는데,
    50개를 전부 무작위의 10만개의 character로 채워서 돌려도 1초만에 답이 구해지거든요..? 오답이 나오면 모르겠는데, 시간초과가 나오니까 답답하네요 ㅋㅋㅋ

    일단 저는 입력받는 string을 S라고 하고, 그 문자열을 Text라는 2배의 길이를 갖는 character 배열에 역순으로 복사하는 방법을 씁니다. 역순으로 복사를 하는데 character 배열의 맨 마지막과 일치하면 일치한 이후 부터 글자의 끝까지 검사해서 모두 일치하면 바로 그 이전까지의 string만 역순으로 붙여주면 회문이 되는 방식으로 합니다.
    제가 봤을 때는 복잡도도 k만큼이 순방향과 역방향 텍스트가 중복되지 않는 갯수라고 했을 때 O(k*n^2) 인것 같은데....
    문제가 되는 테스트케이스라도 있는 걸까요?

    #include <stdio.h>
    #include <string.h>
    
    int idx = 0;
    int sLength = 0;
    int cmp = 0;
    int blank_pt = 0;
    int blank_length = 0;
    char S[1000001] = {0, };
    char text[2000001] = {0, };
    int i=0, j=0;
    
    void Init(){
        idx = 0;
        sLength = 0;
        cmp = 0;
        blank_pt = 0;
        blank_length = 0;
        for(i=0; i<100002; i++)
            S[i] = 0;
        for(i=0; i<200002; i++)
            text[i] = 0;
    }
    
    int main(void){
        int C=0;
        scanf("%d", &C); getchar();
        while(C-->0){
            Init();
            scanf("%s", ::S);
            strcpy(text, ::S);
            sLength = strlen(S);
            idx = sLength + sLength;
            cmp = sLength-1;
    
            for(i=0; i<sLength; i++){
                if(S[cmp] == S[i]){
                    int plus_idx = 0;
                    bool flag = true;
                    for(int j=i; j<sLength; j++){
                        if(S[cmp-(plus_idx)] == S[j])
                            plus_idx++;
                        else{
                            flag = false;
                            break;
                        }
                    }
                    if(flag)
                        break;
                }
                else{
                    text[idx--] = S[i];
                }
            }
            for(i=0; i<sLength+sLength; i++){
                if(text[i] == 0){
                    blank_pt = i;
                    for(j=i; j<sLength+sLength; j++){
                        if(text[j] != 0)
                            break;
                        blank_length++;
                    }
                    for(j=i; j<=(sLength+sLength-blank_length); j++){
                        text[j] = text[j+blank_length];
                        text[j+blank_length] = 0;
                    }
                    break;
                }
            }
            printf("%d\n", strlen(text));
        }
        return 0;
    }
    

    10년 전
2개의 댓글이 있습니다.
  • Being
    Being

    우선 길이가 10만인데 스스로 길이의 제곱에 비례하는 것으로 알고리즘을 의심하신다면 랜덤한 입력이 아닌 최악의 경우의 입력이 무엇인지 잘 생각해 보셔야 합니다. 코드를 잠깐 보니 이런 형태의 입력일 때 잘 돌지 않을 것처럼 보입니다:

    aaaa...aaaabcaaaa...aaaa

    10년 전 link
  • Jinsanger
    Jinsanger

    복잡도 자체가 에러군요 ㅠㅜ 다시 짜겠습니다 ㅎㅎㅎ


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.