본문 바로가기

컴퓨터/알고스팟 알고리즘

알고스팟 알고리즘: DRAWRECT [C++]

문제 출처: algospot.com/judge/problem/read/DRAWRECT

 

algospot.com :: DRAWRECT

사각형 그리기 문제 정보 문제 AdbyMe, Inc. 의 인턴인 A.I.는 웹 브라우저에 직사각형을 그리는 코드를 작성해야 한다. 웹 브라우저는 직사각형 모양의 뷰포트를 가지고 있고, 그려지는 직사각형의

algospot.com

1. 코드

#include <iostream>

using namespace std;

int main(void)
{
	int t;
	cin >> t;

	while (t--)
	{
		int arr[4][2];		//좌표 저장 [i][0] = x좌표, [i][1] = y좌표

		for (int i = 0; i < 3; i++)
			cin >> arr[i][0] >> arr[i][1];

		for (int i = 0; i < 3; i++)
		{
			bool flag1 = true;		//x좌표 확인
			bool flag2 = true;		//y좌표 확인
			for (int j = 0; j < 3; j++)
			{
				if (i == j) continue;	//좌표가 동일할 경우 제외
				if (arr[i][0] == arr[j][0]) flag1 = false;
				if (arr[i][1] == arr[j][1]) flag2 = false;
			}
			if (flag1) arr[3][0] = arr[i][0];
			if (flag2) arr[3][1] = arr[i][1];
		}
		cout << arr[3][0] << " " << arr[3][1] << endl;	//마지막 x좌표와 y좌표 출력
	}
}

(실행)

2. 풀이

문제의 예시 입출력 결과를 살펴보면 x좌표와 y좌표 중 2번 반복하지않은 수가 정답이다. 그렇다면 2번 반복하지 않은 수를 찾아내면 빠르게 해결할 수 있다.

int t;
cin >> t;

while (t--)

테스트 케이스 횟수를 입력받고 그 수만큼 반복해준다.

int arr[4][2];		//좌표 저장 [i][0] = x좌표, [i][1] = y좌표

for (int i = 0; i < 3; i++)
	cin >> arr[i][0] >> arr[i][1];

그리고 좌표를 저장할 배열을 생성해주고, 반복문을 통해 좌표의 위치를 저장한다.

for (int i = 0; i < 3; i++)
{
	bool flag1 = true;		//x좌표 확인
	bool flag2 = true;		//y좌표 확인
	for (int j = 0; j < 3; j++)
	{
		if (i == j) continue;	//좌표가 동일할 경우 제외
		if (arr[i][0] == arr[j][0]) flag1 = false;
		if (arr[i][1] == arr[j][1]) flag2 = false;
	}
	if (flag1) arr[3][0] = arr[i][0];
	if (flag2) arr[3][1] = arr[i][1];
}

2중 반복문으로 2번 이상 겹치지않는 수를 찾아내려고 하는데 조금 더 쉽게 하기위해 bool형 변수 2개를 사용한다. flag1은 x 좌표의 확인을 flag2는 y 좌표의 확인을 해준다. 그리고 i와 j의 값이 동일하면 같은 위치를 비교하는 것이기에 그것을 제외해주고 다른 경우에는 x와 y좌표가 같으면 bool 형 변수의 값을 true에서 false로 변환시켜준다.

반복문이 끝나고 flag1과 flag2의 값이 true라면 좌표를 저장하는 arr에 해당하는 값을 저장해준다.

cout << arr[3][0] << " " << arr[3][1] << endl;	//마지막 x좌표와 y좌표 출력

문제에서 요구한 x 좌표와 y 좌표를 출력해주면 문제는 해결할 수 있다.