최소, 최대 정사각형 구하기 문제 도움 부탁드립니다.

  • kwangswei
    kwangswei

    최소, 최대 정사각형 구하기 문제를 풀고 있습니다.

    가장 무식하게 모든 4개의 꼭지점 조합에 대해서 정사각형이 되는지 판단하여 정사각형일 경우 최소, 최대 값을 추적하도록 구현하였습니다.

    그런데 오답 이 떠서 문제가 무엇인지 도움 요청 드립니다.

    소스는 아래와 같습니다.

    감사합니다.

    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <memory.h>
    
    // 두 점 사이의 거리 구하기.
    int GetDist( int xPos1, int yPos1, int xPos2, int yPos2 )
    {
        return (xPos1-xPos2) * (xPos1-xPos2) + (yPos1-yPos2) * (yPos1-yPos2);
    }
    
    
    int main()
    {
        int T;
        int xPos[51], yPos[51];
    
        scanf("%d", &T);
    
        while ( T-- )
        {
            int count;
            scanf("%d", &count);
    
            memset( xPos, 0, sizeof(int)*51);
            memset( yPos, 0, sizeof(int)*51);
    
            for ( int i = 0; i < count; i++ )
                scanf("%d %d", xPos+i, yPos+i);
    
            int minVal = 10000000;
            int maxVal = -1;
    
            // 무식하게 반복 돌면서 점 4개 조합 만들기.
            for ( int i = 0; i < count; i++ )
            {
                for ( int j = i+1; j< count; j++ )
                {
                    for ( int q = j+1; q < count; q++ )
                    {
                        for ( int k = q+1; k < count; k++ )
                        {
                            double length = -1;
                            double x1 = GetDist( xPos[i], yPos[i], xPos[j], yPos[j]);
                            double x2 = GetDist( xPos[i], yPos[i], xPos[q], yPos[q]);
                            double x3 = GetDist( xPos[i], yPos[i], xPos[k], yPos[k]);
    
                            // 두 점과의 거리가 같으면 인접해 있는 것이므로, 나머지 점과의 거리, 즉 대각선 길이가 같은 지 체크.
                            if ( x1 == x2 && x3 == GetDist(xPos[j], yPos[j], xPos[q], yPos[q]))
                                length = sqrt(x1);
                            else if ( x1 == x3 && x2 == GetDist(xPos[j], yPos[j], xPos[k], yPos[k]))
                                length = sqrt(x1);
                            else if ( x2 == x3 && x1 == GetDist(xPos[q], yPos[q], xPos[k], yPos[k]))
                                length = sqrt(x2);
    
                            // min, max 값 저장해두기.
                            if ( length > 0 && length < minVal )
                                minVal = (int)length;
                            if ( length > 0 && length > maxVal )
                                 maxVal = (int)length;
                            }
                    }
                }
            }
    
            printf( "%d %d\n", minVal, maxVal);
    
    
        }
        return 0;
    }
    

    12년 전
7개의 댓글이 있습니다.
  • hyunhwan
    hyunhwan

    MMRECT1 을 보시면 정사각형의 조건이 다음과 같이 정해져있습니다.

    만들 수 있는 정사각형은 반드시 x-축과 y-축에 평행해야 한다.

    이러한 점을 고려하지 않고, 좌표축에 평행하지 않은 정사각형도 고려하셔서 오답이 나오는 것 아닌가 싶습니다.


    12년 전 link
  • VOCList
    VOCList

    @LIBe 소스는 안봤지만 앞뒤가 좀 안맞지 않나영.. 안평행한 정사각형도 고려했으면 평행한건 자연히 처리되는게 ㅠ


    12년 전 link
  • Taeyoon_Lee
    Taeyoon_Lee

    다이아몬드 형태의 사각형이 검사가 되면, 답이 틀릴 수 있지 않을까요?


    12년 전 link
  • kwangswei
    kwangswei

    @LIBe @Taeyoon_L @VOCList 모두 감사합니다. 사소한 조건이라도 놓치지 말아야겠네요. ^_^ 한 번 처리해보도록 하겠습니다. 감사합니다.


    12년 전 link
  • hyunhwan
    hyunhwan

    @VOCList 안 평행한게 더 클 수 있죠오.


    12년 전 link
  • VOCList
    VOCList

    아 찍는 답이 평행해야하는군 ㅜㅜ 죄송죄송


    12년 전 link
  • kwangswei
    kwangswei

    평행 조건 처리하고 나니 "정답" 처리 되었습니다.
    모두들 감사드립니다. ^___^


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