DRAWRECT 질문입니다.

  • sstzz
    sstzz

    문제를 해결하기 위한 제 알고리즘은 다음과 같습니다.

    1) 0~3까지 각 꼭지점을 Indexing한다. 답은 3에 해당하는 점이다.
    2) 변끼리 평행하다는 것이 보장되 있으므로 평행한 변 끼리의 차는 같다고 한다.
    3) 위 수식을 계산하기 앞서 주어진 점중 대각선에 위치한 두 점을 구한다. 총 3개의 점이므로 3C2 만큼 비교하면 되므로 총 3번 비교한다.
    4) 3 가지 경우 각각의 x, y 좌표를 구한다. 차는 절대값으로 두었다.

    다음은 코드입니다.

    #include <iostream>
    #include <cmath>
    using namespace std;
    class drawRect{
        public:
            drawRect(){
                for(int i =0 ;i<=3;i++){
                    rect_x[i]=0;
                    rect_y[i]=0;
                }
            }
            void inputRect(){
                for(int i= 0; i<=2;i++) {
                    cin >> rect_x[i] >> rect_y[i];  
                }
            }
    
            int findDiag(){    // 대각선에 위치한 좌표끼리의 차는 0이 아니라는 성질을 이용해 해당좌표의 index의 합을 리턴합니다.
                if(((rect_x[1] - rect_x[0]) !=0) && ((rect_y[1] - rect_y[0]) != 0)){
                    return 1;
                }
                else if(((rect_x[2] - rect_x[1]) !=0) && ((rect_y[2] - rect_y[1]) != 0)){
                    return 3;
                }
                else {   // 0과 2에 해당하는 좌표가 서로 대각에 위치할 때 입니다.
                    return 2;
                }
            }
    
            void findAnsw(int index){
    
                switch (index){
                    case 1:
                        rect_x[3] = abs(rect_x[0] - rect_x[2]) + rect_x[1];  // 0과 1에 해당하는 좌표가 서로 대각선에 위치하므로 마주보는 변의 길의는 같다고 두고 변수를 구합니다.
                        rect_y[3] = abs(rect_y[0] - rect_y[2]) + rect_y[1];  // 마찬가지로 y좌표도 구합니다.
                        break;
                    case 2:
                        rect_x[3] = abs(rect_x[1] - rect_x[0]) + rect_x[2];
                        rect_y[3] = abs(rect_y[1] - rect_y[0]) + rect_y[2];
                        break;
                    case 3:
    
                        rect_x[3] = abs(rect_x[0] - rect_x[1]) + rect_x[2];
                        rect_y[3] = abs(rect_y[0] - rect_y[1]) + rect_y[2];
                        break;
                }
            }
            void printAnsw(){
                cout<<rect_x[3]<<" "<<rect_y[3]<<endl; // 출력합니다.
            }
            void clearRect(){
                for(int i = 0 ;i<=3;i++){
                    rect_x[i]=0;
                    rect_y[i]=0;
                }
            }
    
        private:
            int rect_x[4];  // x좌표의 모음입니다. 4번째 좌표는 정답에 해당하는 좌표입니다.
            int rect_y[4];  // y좌표의 모음입니다.
    };
    
    int main(){
        int t;
        cin >> t;
        drawRect rect1;
        while(t--){
            rect1.inputRect();
            rect1.findAnsw(rect1.findDiag());
            rect1.printAnsw();
            rect1.clearRect();
        }
        return 0;
    }
    

    어디가 오류인지 아무리봐도 모르겠습니다.


    10년 전
1개의 댓글이 있습니다.
  • 샥후
    샥후

    findAnsw내에 식에 문제가 있어보입니다.
    0,1번 점이 입력시 순서가 바뀌어도 답이 같아야 합니다.


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