[algospot/C] DRAWRECT
DRAWRECT
문제
AdbyMe, Inc. 의 인턴인 A.I.는 웹 브라우저에 직사각형을 그리는 코드를 작성해야 한다. 웹 브라우저는 직사각형 모양의 뷰포트를 가지고 있고, 그려지는 직사각형의 네 변은 반드시 그 뷰포트의 두 축에 평행해야 한다.
한편, A.I.는 코드를 작성하던 중 그릴 직사각형의 네 꼭지점 중 어느 것이든 세 개의 좌표를 알고 있다면 나머지 점의 위치는 유일하게 결정됨을 알아내었다 (네 점 중 어떤 두 개의 좌표를 알아낸 경우는 때에 따라 직사각형을 결정하지 못할 수도 있다.)
A.I.는 LIBe에게 이를 이번 대회 문제로 출제할 것을 제안하였다.
직사각형을 이루는 네 점 중 임의의 세 점의 좌표가 주어졌을 때, 나머지 한 개의 점의 좌표를 찾는 프로그램을 작성하라.
입력
입력은 T 개의 테스트 케이스로 구성된다. 입력의 첫 행에는 T 가 주어진다.
각 테스트 케이스는 공백 하나로 구분되는 두 개씩의 정수로 구성된 세 행으로 이뤄지며, 각각 임의의 세 점의 x와 y 좌표이다. 브라우저 뷰포트의 맨 왼쪽 위 픽셀의 좌표는 (1, 1)이고, 맨 오른쪽 아래 픽셀의 좌표는 (1000, 1000)이다. 모든 좌표는 뷰포트 안에 위치하며, 각 점의 위치는 모두 다르다.
출력
각 테스트 케이스에 대해 한 행에 하나씩 좌표가 주어지지 않은 나머지 한 점의 x와 y 좌표를 공백 하나로 구분하여 출력한다.
예제 입력
2
5 5
5 7
7 5
30 20
10 10
10 20
예제 출력
7 7
30 10
나의 풀이
#include <stdio.h>
int main()
{
int i,cases;
unsigned int pos1,pos2;
unsigned int x[3];
unsigned int y[3];
scanf("%d",&cases);
while(cases--)
{
for(i=0;i<3;i++)
scanf("%u %u",&x[i],&y[i]);
pos1=x[0]^x[1]^x[2];
pos2=y[0]^y[1]^y[2];
printf("%u %u\n",pos1,pos2);
}
return 0;
}
비트연산을 써먹어 보자
XOR을 떠올려보자. 학교에서는 0과 1을 예시로 들었지만 이진수건 십진수건 상관없다
A XOR A = 0 그리고 0 XOR A = A
그러면 A XOR A XOR B는 뭘까, 감이 좀 잡혔을까?
x좌표, y좌표에 각각 적용하면 나머지 한 점이 나오게 된다.
가장 빠른 풀이
#include<stdio.h>
typedef struct
{
int x;
int y;
}Point;
int main()
{
Point p1, p2, p3, p4;
int num;
scanf("%d", &num);
int T = 0;
while (T < num)
{
scanf("%d %d", &p1.x, &p1.y);
scanf("%d %d", &p2.x, &p2.y);
scanf("%d %d", &p3.x, &p3.y);
if (p3.x == p1.x)
{
p4.x = p2.x;
}
else if(p3.x==p2.x)
{
p4.x = p1.x;
}
else
{
p4.x = p3.x;
}
if (p3.y == p1.y)
{
p4.y = p2.y;
}
else if (p3.y == p2.y)
{
p4.y = p1.y;
}
else
{
p4.y = p3.y;
}
printf("%d %d\n", p4.x, p4.y);
T++;
}
return 0;
}
크기는 내꺼보다 크긴한데… 비교연산이 비트연산보다 빠른걸까
댓글남기기