SortGame 문제에 답안을 제출하면 오답이 나옵니다.

  • 정용진
    정용진

    SortGame 에서 시간초과가 뜨더라도 결과값이 정확한지 확인해보고 싶어 구현 후 제출을 했습니다.
    여러테스트케이스를 다 확인해도 최소값이 나오는데 오답이라고 나와서 왜그런지 모르겠습니다.
    알고리즘은 작은수부터 앞에서 정렬해 나가거나 큰수부터 뒤에서 정렬해 나가는방식으로 했습니다.
    이 알고리즘에 반하는 테스트케이스가 있는지 알고 싶습니다.

    #include <stdio.h>
    #include <math.h>
    #include <memory.h>
    
    void swap(int *arrNumber, int nSrc, int nDst)
    {
        int nTemp = 0;
        while(true)
        {
            if(nSrc >= nDst)
            {
                return;
            }
    
            nTemp = arrNumber[nSrc];
            arrNumber[nSrc] = arrNumber[nDst];
            arrNumber[nDst] = nTemp; 
    
            ++nSrc;
            --nDst;
        }
    }
    
    int main()
    {
        int nCaseCnt = 0;
        scanf("%d", &nCaseCnt);
    
        for(int k=0;k<nCaseCnt;k++)
        {
            int nNumberLen = 0;
            scanf("%d", &nNumberLen);
    
            if(nNumberLen < 1 || nNumberLen  > 8) continue;
    
            int arrNumber[8];
            int arrNumber2[8];      
            for(int i=0;i<nNumberLen;i++)
            {
                scanf("%d", &arrNumber[i]);         
            }
    
            memcpy(arrNumber2, arrNumber, sizeof(int) * 8);
    
            int nSwapCount1 = 0;
            int nMinIndex = 0;
            while(nNumberLen > nMinIndex)
            {
                int nMaxValueIndex = nMinIndex;
                for(int i=nMinIndex+1;i<nNumberLen;i++)
                {
                    if(arrNumber[nMaxValueIndex] > arrNumber[i])
                        nMaxValueIndex = i; 
                }
    
                if(nMaxValueIndex != nMinIndex)
                {
                    swap(arrNumber, nMinIndex, nMaxValueIndex);
                    ++nSwapCount1;
                }
    
                ++nMinIndex;
            }
    
            int nSwapCount2 = 0;
            while(nNumberLen > 0)
            {
                int nMaxValueIndex = 0;
                for(int i=1;i<nNumberLen;i++)
                {
                    if(arrNumber2[nMaxValueIndex] < arrNumber2[i])
                        nMaxValueIndex = i; 
                }
    
                if(nMaxValueIndex < (nNumberLen - 1))
                {
                    swap(arrNumber2, nMaxValueIndex, nNumberLen - 1);
                    ++nSwapCount2;
                }
    
                --nNumberLen;
            }
    
    
            printf("%d\n", nSwapCount1 > nSwapCount2 ? nSwapCount2 : nSwapCount1);
        }
    
        return 0;
    }
    

    8년 전
1개의 댓글이 있습니다.
  • hyunhwan
    hyunhwan
    1
    8
    1 8 2 4 3 7 5

    을 넣으면 3이 나와야 하는데, 돌려보니 5가 나옵니다. 그리고 모든 가능한 경우 - N!의 경우의 수 - 를 헤아리도록 구현하셔야 할 것입니다.


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