SORTGAME 문제 문의 드립니다;;

  • hyuk0512
    hyuk0512

    아무래도 특이 case에 문제가 있어서 오답 처리되는 것 같은데,
    경계점을 못찾겠네요 ㅠ

    문제를 간략히 요약하면,
    수열이 주어졌을 때 연속된 수를 최소 몇번 뒤집어야 오름차순으로 정렬되는지
    물어보는 문제입니다.

    제가 작성한 코드는 아래와 같구요,
    알고리즘을 설명 드리면,
    main 함수 while 안쪽으로 BFS 써서 구현했습니다.

    제가 혹시 어떤 부분을 놓치고 있는지...도움주시면 감사하겠습니다.

    #include <stdio.h>
    //#define DEBUG
    int testN;
    int input[8];
    int num_cnt;
    int cnt = 0;
    int pos = 0;
    int temp1_input[8];
    int temp2_input[8];
    int find_sol;
    
    
    #ifdef DEBUG
    int debug;
    #endif
    
    int zero[5000000];
    int l[5000000];
    
    int square (int a, int b)
    {
        int i;
        int tmp = 1;
    
        if (b == 0)
            return 1;
        else
        {
            for (i = 0; i < b; i++)
            {
                tmp = tmp*a;
            }
        }
    
        return tmp;
    
    }
    
    int convert_array_to_int (int *array, int array_length)
    {
        int i, sum;
        sum = 0;
        for (i = 0; i < array_length; i++)
        {
            sum = sum + square (10, array_length - 1 - i)*array[i];
        }
    
        return sum;
    }
    
    void convert_int_to_array (int *array, int num, int array_length)
    {
        int i;
        int cntt = array_length - 1;
    
        while (1)
        {
            if (cntt < 0)
                break;
    
            i = num%10;
            array[cntt] = i;
            cntt--;
            num = (num - i)/10;
        }
    
    }
    
    void copy_array (int *array1, int *array2, int length)
    {
        int i;
    
        for (i = 0; i < length; i++)
        {
            array1[i] = array2[i];
        }
    }
    
    void enqueue (int *array, int ll, int array_length)
    {
    
        l[cnt] = ll;
        zero[cnt] = convert_array_to_int (array, array_length);
    
    
            cnt++;
    
    
    }
    
    int dequeue (int *array)
    {
        int ret;
        array[0] = zero[pos];
        ret = l[pos];
    
        pos++;
    
        return ret;
    }
    
    void switch_array (int width, int position, int *array)
    {
        int i;
        int N, temp;
        if ((width%2) == 0)
            N = width / 2;
        else
            N = ((int)(width/2)) + 1;
    
    
        for (i = 0; i < N; i++)
        {
            temp = array[position + i];
            array[position + i] = array[position + width - 1 - i];
    
            array[position + width - 1 - i] = temp;
    
        }
    
    
    }
    
    int check_sequence (int *array, int seq_num)
    {
        int i = 1;
    
        for (i = 0; i < (seq_num-1); i++)
        {
            if (array[i] > array[i+1])
            {
                i = 0;
                break;
            }
        }
    
        return i;
    }
    
    int main(void)
    {
        int i, idx;
        int width_idx, position_idx;
        int ret;
        scanf ("%d", &testN);
        for (i = 0; i < testN; i++)
        {
            ret = 0;
            pos = 0;
            cnt = 0;
            find_sol = 0;
    #ifdef DEBUG
            debug = 0;
    #endif
    
            scanf ("%d", &num_cnt);
            for (idx = 0; idx < num_cnt; idx++)
            {
                scanf ("%d", &input[idx]);
            }
    
            /* copy the input value */
            copy_array (temp1_input, input, num_cnt);
    
            if (check_sequence (input, num_cnt) || (num_cnt == 1))
            {
                printf ("0\n");
            }
            else
            {
    
                while (1)
                {
                    for (width_idx = 2; width_idx <= num_cnt; width_idx++)
                    {
                        for (position_idx = 0; position_idx <= num_cnt-width_idx; position_idx++)
                        {
    #ifdef DEBUG
                            debug++;
    #endif
    
                            if (ret)
                                convert_int_to_array (temp1_input, temp2_input[0], num_cnt);
    
                            copy_array (input, temp1_input, num_cnt);
                            switch_array (width_idx, position_idx, input);
    
    
                            /* queuing for BFS */
                            if (( ret == 0))
                                enqueue (input, 1, num_cnt);
                            else
                                enqueue (input, ret+1, num_cnt);
    
                            if ((check_sequence (input, num_cnt)))
                            {
                                find_sol = 1;
                                break;
                            }
                        }
    
                        if (find_sol == 1)
                            break;
    
                    }
                    if (find_sol == 1)
                        break;
    
                    /* pop the next value */
                    ret = dequeue (temp2_input);
                }
    
    #ifdef DEBUG
                printf ("%d, debug:%d\n", l[cnt-1], debug);
    #else
                printf ("%d\n", l[cnt-1]);
    #endif
            }
    
    
        }
    
    
        return 0;
    }
    

    9년 전
1개의 댓글이 있습니다.
  • 일루
    일루

    '모든 수는 1부터 1백만 사이의 정수이다.' 때문에 특정 가정이 만족되지 않는 것으로 보입니다. 다른 데에도 틀린 점이 있는지는 잘 모르겠네요.


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