[Day 2] BOJ 1485 : 정사각형

khj20006·2022년 11월 1일
post-thumbnail

문제

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

초등학교를 졸업했다면 간단히 풀 수 있을 것만 같아요 !!

해결 전략

우선, 네 개의 점을 입력받아 x좌표, y좌표 오름차순으로 점을 정렬한 다음,

case를 두 가지로 나눴습니다.

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

이런 경우에는,

  • 나머지 변들이 x 또는 y축에 평행한가?
  • 네 변의 길이가 모두 같은가?

를 확인해주면 정사각형인지 알 수 있습니다.

나머지 변들이 모두 x 또는 y축에 평행함은 곧 모든 변들이 이루는 각이 직각임을 의미합니다.

  • 위에 해당하지 않는 경우

이 경우 역시 네 변의 길이가 모두 같은지, 두 대각선의 길이가 같은지 확인하고
초등학교 수학 시간에 배운 피타고라스 정리를 이용하여 대각선의 길이가 변 X 2\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';
	}
}

아니 맞는데 왜 틀렸냐고 ㅋㅋ

회고

컴퓨터는 거짓말하지 않습니다.
틀렸습니다를 받으면 화를 내지 마시고 다시 한 번 생각해 보세요!

profile
PS 및 알고리즘 공부, 개발 등 잡다한 코딩 관련 블로그

0개의 댓글