[algospot/C] DRAWRECT

1 분 소요

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;
}

비트연산을 써먹어 보자

XORGATE

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;
}

크기는 내꺼보다 크긴한데… 비교연산이 비트연산보다 빠른걸까

댓글남기기