
네 개의 점이 주어지면 이것들이 정사각형을 이룰 수 있는지 판단하는 문제입니다.
초등학교를 졸업했다면 간단히 풀 수 있을 것만 같아요 !!
우선, 네 개의 점을 입력받아 x좌표, y좌표 오름차순으로 점을 정렬한 다음,
case를 두 가지로 나눴습니다.
- x좌표 기준으로 첫 번째, 두 번째 점을 이었을 때 y축에 평행한 경우
이런 경우에는,
를 확인해주면 정사각형인지 알 수 있습니다.
나머지 변들이 모두 x 또는 y축에 평행함은 곧 모든 변들이 이루는 각이 직각임을 의미합니다.
- 위에 해당하지 않는 경우
이 경우 역시 네 변의 길이가 모두 같은지, 두 대각선의 길이가 같은지 확인하고
초등학교 수학 시간에 배운 피타고라스 정리를 이용하여 대각선의 길이가 변 X 인지 확인해줍니다.
#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';
}
}
아니 맞는데 왜 틀렸냐고 ㅋㅋ
컴퓨터는 거짓말하지 않습니다.
틀렸습니다를 받으면 화를 내지 마시고 다시 한 번 생각해 보세요!