1) 0~3까지 각 꼭지점을 Indexing한다. 답은 3에 해당하는 점이다.
2) 변끼리 평행하다는 것이 보장되 있으므로 평행한 변 끼리의 차는 같다고 한다.
3) 위 수식을 계산하기 앞서 주어진 점중 대각선에 위치한 두 점을 구한다. 총 3개의 점이므로 3C2 만큼 비교하면 되므로 총 3번 비교한다.
4) 3 가지 경우 각각의 x, y 좌표를 구한다. 차는 절대값으로 두었다.
다음은 코드입니다.
#include <iostream>#include <cmath>usingnamespacestd;classdrawRect{public:drawRect(){for(inti=0;i<=3;i++){rect_x[i]=0;rect_y[i]=0;}}voidinputRect(){for(inti=0;i<=2;i++){cin>>rect_x[i]>>rect_y[i];}}intfindDiag(){// 대각선에 위치한 좌표끼리의 차는 0이 아니라는 성질을 이용해 해당좌표의 index의 합을 리턴합니다.if(((rect_x[1]-rect_x[0])!=0)&&((rect_y[1]-rect_y[0])!=0)){return1;}elseif(((rect_x[2]-rect_x[1])!=0)&&((rect_y[2]-rect_y[1])!=0)){return3;}else{// 0과 2에 해당하는 좌표가 서로 대각에 위치할 때 입니다.return2;}}voidfindAnsw(intindex){switch(index){case1: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;case2: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;case3: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;}}voidprintAnsw(){cout<<rect_x[3]<<" "<<rect_y[3]<<endl;// 출력합니다.}voidclearRect(){for(inti=0;i<=3;i++){rect_x[i]=0;rect_y[i]=0;}}private:intrect_x[4];// x좌표의 모음입니다. 4번째 좌표는 정답에 해당하는 좌표입니다.intrect_y[4];// y좌표의 모음입니다.};intmain(){intt;cin>>t;drawRectrect1;while(t--){rect1.inputRect();rect1.findAnsw(rect1.findDiag());rect1.printAnsw();rect1.clearRect();}return0;}
sstzz
문제를 해결하기 위한 제 알고리즘은 다음과 같습니다.
1) 0~3까지 각 꼭지점을 Indexing한다. 답은 3에 해당하는 점이다.
2) 변끼리 평행하다는 것이 보장되 있으므로 평행한 변 끼리의 차는 같다고 한다.
3) 위 수식을 계산하기 앞서 주어진 점중 대각선에 위치한 두 점을 구한다. 총 3개의 점이므로 3C2 만큼 비교하면 되므로 총 3번 비교한다.
4) 3 가지 경우 각각의 x, y 좌표를 구한다. 차는 절대값으로 두었다.
다음은 코드입니다.
어디가 오류인지 아무리봐도 모르겠습니다.
11년 전