DECODE 오답 문제

  • rabi
    rabi

    문제는 DECODE 입니다.

    저는 일단 주어진 cipher를 matrix 형태로 복원한다음, 그 matrix를 나선형으로 읽은 문자를 string이라는 변수에 저장하였고, 각 문자가 길이 5의 binary형태이므로 문자를 구하는 BinToCh 함수를 만들어 plaintext라는 변수에 저장하였습니다. 마지막으로 plaintext의 양 옆 공백을 제거한 값을 ans에 저장하여 출력했습니다.

    Test case는 예제를 비롯해서 행이 1인 경우 몇개와 열이 1인 경우 몇개, 행이 20인 경우 몇개와 열이 20인 경우 몇 개를 해봤고 전부 올바른 문자열이 나왔습니다.
    어디가 잘못된걸까요?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #ifdef _MSC_VER
    #pragma warning(disable:4996)
    #endif
    
    int BinToCh(char* bin)
    {
        int ch = 0;
        int i = 0;
        int val = 1;
    
        for(i=4; i>=0; i--)
        {
            if(bin[i] == '1')
            {
                ch += val;
            }
            val *= 2;
        }
        if(ch > 0 && ch < 27)
        {
            return ch + ('A' - 1);
        }
        else
        {
            return ' ';
        }
    }
    
    char* Trim(char* buf, int len)
    {
        char* temp;
        char* end;
        char* start;
        temp =(char*)calloc(len + 1, sizeof(char)); 
    
        strcpy(temp, buf);
        end = temp + strlen(temp) - 1;
    
        while(end != temp && *end == ' ')
        {
            end--;
        }
        *(end + 1) = '\0';
    
        start = temp;
    
        while(start != (temp + strlen(temp) - 1) && *start == ' ')
        {
            start++;
        }
    
        strcpy(buf, start);
        free(temp);
    
        return buf;
    }
    
    int main(int argc, char** argv)
    {
        int n = 0;
        int i = 0;
        int j = 0;
        int k = 0;
        int row = 0;
        int col = 0;
        int R = 0;
        int C = 0;
        size_t idx = 0;
        size_t l = 0;
        int cnt = 0;
        char string[401] = {0, };
        char plaintext[401] = {0, };
        char* ans;
        char matrix[21][21] = {0, };
        char cipher[401] = {0,};
    
        scanf("%d", &n);
    
        for(i=0; i<n; i++)
        {
            idx = 0;
            cnt = 0;
            row = 0;
            col = 0;
            scanf("%d %d %s", &R, &C, cipher);
    
            for(j=0; j<21; j++)
            {
                for(k=0; k<21; k++)
                {
                    matrix[j][k] = '\0';
                }
            }
    
            for(j=0; j<R; j++)
            {
                for(k=0; k<C; k++)
                {
                    matrix[j][k] = cipher[j*C + k];
                }
            }
    
            while(idx < strlen(cipher))
            {
    
                if(idx == 0)
                {
    
                }
                else if(R == 1)
                {
                    col++;
                }
                else if(C == 1)
                {
                    row++;
                }
                else if(col == (C - 1) && row != (R - 1))
                {
                    row++;
                }
                else if(row == (R - 1) && col != cnt)
                {
                    col--;
                }
                else if(col == cnt && row != cnt)
                {
                    row--;
                }
                else
                {
                    col++;
                }
    
                if(row == cnt && col == cnt && idx > 1)
                {
                    row++;
                    col++;
                    R--;
                    C--;
                    cnt++;
                }
    
                string[idx++] = matrix[row][col];
            }
    
            for(l=0; l<strlen(string)/5; l++)
            {
                plaintext[l] = BinToCh(string + 5*l);
            }
            plaintext[l] = '\0';
            ans = Trim(plaintext, strlen(plaintext));
    
            printf("%d %s\n", (i+1), ans);
            memset(string, 0, strlen(string));
            memset(plaintext, 0, strlen(plaintext));
        }
    }
    

    코드는 위와 같습니다.


    8년 전
2개의 댓글이 있습니다.
  • pushbell7
    pushbell7

    음.. 저의 개인적인 짧은 견해이지만 0000000000001000000000000 같은 테스트 케이스가 있을 경우에 Trim에서 공백을 모두 잘라내서 생기는 오답일 수도 있지 않을까 하는 생각이 있습니다.
    네칸띄우고 마지막에 A인데 Trim함수가 공백을 모두 잘라내버려서 그냥 바로 A가 나오거든요... 그게 아니면 저는 모르겠네요...


    8년 전 link
  • rabi
    rabi

    오른쪽만 Trim 하도록 고쳐봤는데 안되네요 ㅠㅠ
    답변 달아주셔서 감사합니다 :)


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