python/백준 - 1485번 문제에 대한 분석임.
import sys
input = sys.stdin.readline
# 두 점의 좌표(list 타입)를 입력 받아 거리를 출력해주는 함수
# 원래는 거리를 표현하기위해서는 아래 식에 제곱근을 씌워야 하지만
혹시 모를 부동소수점 부정확성을 피하고자 제곱근은 씌우지 않음.
def calculate_line(a, b):
return (abs(b[0]-a[0])**2 + abs(b[1]-a[1])**2)
n = int(input())
for _ in range(n):
l = [list(map(int, input().split())) for _ in range(4)]
l.sort(key=lambda x: (x[0], x[1]))
# 대각선의 정의
# 1. 모든 변의 길이가 같다
# 2. 모든 대각선의 길이가 같다.
answer = [calculate_line(l[0], l[1]),
calculate_line(l[0], l[2]),
calculate_line(l[0], l[3]),
calculate_line(l[1], l[2]),
calculate_line(l[1], l[3]),
calculate_line(l[2], l[3]),]
# len(set(answer))==2 => answer의 고유원소는 2개 (변의 길이, 대각선의 길이)
# answer.count(max(answer))==2 => 대각선의 길이가 제일 길며 그 갯수는 2개
# answer.count(min(answer))==4 => 변의 길이는 제일 작으며 그 갯수는 4개
if len(set(answer))==2 and \
answer.count(max(answer))==2 and \
answer.count(min(answer))==4: print(1)
else:
print(0)
def calculate_line(a, b):
return (abs(b[0]-a[0])**2 + abs(b[1]-a[1])**2)
n = int(input())
for _ in range(n):
l = [list(map(int, input().split())) for _ in range(4)]
l.sort(key=lambda x: (x[0], x[1]))
answer = [calculate_line(l[0], l[1]),
calculate_line(l[0], l[2]),
calculate_line(l[0], l[3]),
calculate_line(l[1], l[2]),
calculate_line(l[1], l[3]),
calculate_line(l[2], l[3]),]
if len(set(answer))==2 and \
answer.count(max(answer))==2 and \
answer.count(min(answer))==4: print(1)
else:
print(0)
len(set(answer))==2: 정사각형 정의에 의해 변의 길이는 모두 같으며 대각선의 길이는 모두 같아야 합니다. 즉, set으로 중복값이 제거된 answer list의 원소는 [변의 길이, 대각선의 길이] 2개만 있어야 합니다.answer.count(max(answer))==2: 대각선의 길이는 무조건 변의 길이보다 길기 때문에 max(answer)는 무조건 대각선의 길이가 됩니다. 그리고 대각선은 2개이며 그 길이가 같기 때문에 반드시 max(answer)의 원소 갯수는 2개가 되어야 합니다.answer.count(min(answer))==4: 대각선과 같은 경우로 변은 4개이며 무조건 길이가 같아야 합니다. 1을 출력 그렇지 않으면 0을 출력합니다.