문제 풀이

BOJ 1485 : 정사각형 [C++]

khj20006 2023. 2. 14. 06:00
반응형

 

https://www.acmicpc.net/problem/1485

 

1485번: 정사각형

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 네 줄로 이루어져 있으며, 점의 좌표가 한 줄에 하나씩 주어진다. 점의 좌표는 -100,000보다 크거나 같고, 100,000보다 작거나 같

www.acmicpc.net

 

문제 요약

네 개의 점이 주어지면 이것들이 정사각형을 이룰 수 있는지 판단하는 문제이다.

 

해결 전략

우선, 네 개의 점을 입력받아 오름차순 정렬 후 두 가지 case로 나누었다.

 

1. x좌표를 기준으로 첫 번째, 두 번째 점을 이었을 때 y축에 평행한 경우

2. 1번이 아닌 경우

 

1번의 경우에는 나머지 변들이 각각 축에 평행하고 길이가 모두 같다면 정사각형이다.

 

2번의 경우에는 네 변의 길이가 모두 같은지, 두 대각선의 길이가 같은 지 확인하고

피타고라스 정리를 이용하여 대각선의 길이가 변의 길이 $\times \sqrt2$인지 확인해준다.

 

#include <iostream>
#include <algorithm>
using namespace std;
using ll = long long;

ll R(pair<ll, ll> a, pair<ll, ll> b) {
	return (a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second);
}

int main() {
	int N;
	for (cin >> N; N--;) {
		pair<ll, ll> P[4]{};
		for (int i = 0; i < 4; i++)	cin >> P[i].first >> P[i].second;
		sort(P, P + 4);
		ll d1 = R(P[0], P[1]);
		ll d2 = R(P[0], P[2]);
		ll d3 = R(P[1], P[3]);
		ll d4 = R(P[2], P[3]);
		bool c = (d1 == d2 && d2 == d3 && d3 == d4);
		if (P[0].first == P[1].first) {
			bool c1 = P[2].first == P[3].first;
			bool c2 = P[0].first != P[2].first;
			bool c3 = P[0].second == P[2].second;
			c &= (c1 & c2 & c3);
		}
		else {
			ll d5 = R(P[0], P[3]);
			ll d6 = R(P[1], P[2]);
			bool c1 = (d1 + d2 == d6);
			bool c2 = (d3 + d4 == d5);
			bool c3 = (d5 == d6);
			c &= (c1 & c2 & c3);
		}
		cout << c << '\n';
	}
}
반응형

'문제 풀이' 카테고리의 다른 글

BOJ 10830 : 행렬 제곱 [C++]  (0) 2023.02.18
BOJ 11729 : 하노이 탑 이동 순서 [C++]  (0) 2023.02.16
BOJ 13116 : 30번 [C++]  (0) 2023.02.12
BOJ 16120 : PPAP [C++]  (0) 2023.02.10
BOJ 25639 : 수열과 최대 상승 쿼리 [C++]  (0) 2023.02.08