[Python] 백준 1485번: 정사각형

SeungHyun·2023년 9월 25일

coding test

목록 보기
6/16

0. 기본 정보

0-A. 개요

python/백준 - 1485번 문제에 대한 분석임.

0-B. 문제 정보

백준 - 1485번: 정사각형


1. 정답 코드

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)

2. 핵심풀이

  • 정사각형의 정의
    • 모든 변의 길이가 같다.
    • 모든 대각선의 길이가 같다.

2-a. 코드 분석

def calculate_line(a, b):
    return (abs(b[0]-a[0])**2 + abs(b[1]-a[1])**2)
  • 문제에서 제시한 4개의 점 중 2개의 점을 입력받아 그 길이를 출력해주는 함수
  • 4개의 점을 2중 list로 입력받기에 점 하나에 1중 list로 입력 받는다.(list type)

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]))
  • 문제의 test case 숫자와 4개의 점을 입력 받는 코드

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]),]
  • 원소 갯수 및 원소의 대소관계를 통해 문제를 해결하기 위한 answer list
  • 각각 점에서 점까지의 거리를 중복없이 위에서 작성한 함수로 계산해줌.
    • ex) 점(a, b, c, d)에서 a에서 b까지의 거리는 b에서 a까지의 거리와 동일하므로 둘 중 하나만 answer list에 포함한다.

    if len(set(answer))==2 and \
        answer.count(max(answer))==2 and \
            answer.count(min(answer))==4: print(1)
    else:
        print(0)
  1. len(set(answer))==2: 정사각형 정의에 의해 변의 길이는 모두 같으며 대각선의 길이는 모두 같아야 합니다. 즉, set으로 중복값이 제거된 answer list의 원소는 [변의 길이, 대각선의 길이] 2개만 있어야 합니다.
  2. answer.count(max(answer))==2: 대각선의 길이는 무조건 변의 길이보다 길기 때문에 max(answer)는 무조건 대각선의 길이가 됩니다. 그리고 대각선은 2개이며 그 길이가 같기 때문에 반드시 max(answer)의 원소 갯수는 2개가 되어야 합니다.
  3. answer.count(min(answer))==4: 대각선과 같은 경우로 변은 4개이며 무조건 길이가 같아야 합니다.
  • 위 3가지 조건을 모두 만족하면 정사각형이므로 1을 출력 그렇지 않으면 0을 출력합니다.
profile
어디로 가야하오

0개의 댓글