[백준 1485번 문제, Python3] 정사각형

2023. 3. 25. 20:37·정리 전 게시글/공부 관련

문제

문제

네 점이 주어졌을 때, 네 점을 이용해 정사각형을 만들 수 있는지 없는지를 구하는 프로그램을 작성하시오.

입력

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


코드

import math


class Line:
    x1, y1, x2, y2 = 0, 0, 0, 0
    length = 0

    def __init__(self, a, b):
        self.x1 = a[0]
        self.y1 = a[1]
        self.x2 = b[0]
        self.y2 = b[1]
        self.length = math.sqrt((self.x1 - self.x2) ** 2 + (self.y1 - self.y2) ** 2)    # d = √((x2-x1)² + (y2-y1)²)

    def __lt__(self, other):
        return self.length < other.length    # 비교를 위한 메서드 재정의

    def slope(self):
        return (self.y2 - self.y1) / (self.x2 - self.x1)    # 기울기 반환 메서드


count = int(input())
input_list = []
for i in range(count * 4):
    tmp = list(map(int, input().split(" ")))
    input_list.append(tmp)  # input_list = [[1, 1], [1, 2], [2, 1], [2, 2], [2, 2], [3, 3], [4, 4], [5, 5]]

for i in range(0, count):
    tmp = input_list[i * 4:(i + 1) * 4]  # [[1, 1], [1, 2], [2, 1], [2, 2]] 각 점을 저장하는 리스트
    tmp2 = []    # 각 점을 이은 선분을 저장하는 리스트
    for index, value in enumerate(tmp):
        for k in range(index + 1, len(tmp)):
            tmp2.append(Line(value, tmp[k]))

    tmp2 = sorted(tmp2, reverse=True)  # 무조건 tmp2[0], tmp2[1] 대각선 객체

    # 대각선으로 정사각형인지 체크
    try:
        # 두 선분이 교차하는 각을 계산해야함
        # 그러나 두 선분의 기울기를 빼면 0이 나올 때가 있음
        theta = math.degrees(
            math.atan(abs((tmp2[1].slope() - tmp2[0].slope()) / (1 + tmp2[0].slope() * tmp2[1].slope()))))
        if theta == 90:    # 만약 두 선분이 교차하는 각이 90도이면 정사각형이다
            print(1)
        else:
            print(0)

    except:    # 두 점의 기울기가 같은 경우 ZeroDivisionError 에러가 생긴다
        if tmp2[1].length == tmp2[0].length:
            print(1)    # 두 선분의 절대값 기울기가 같은 경우 수직선이다. 이 때 두 선분의 길이가 같으면 정사각형.
        else:
            print(0)

해결

각 점이 있으면 두 점의 길이를 각각 구하고 큰 순서대로 정렬하면 가장 앞과 두번째가 대각선 길이가 될것이다
두 대각선이 교차하는 각이 90도이면 정사각형이라고 생각해서 저렇게 풀었다
 

# 두 직선이 이루는 각 계산
theta = math.degrees(math.atan(abs((m2-m1)/(1+m1*m2))))

 
두 직선이 이루는 각은 위 공식으로 구하는데
0을 나누는 경우가 생긴다 그래서 예외 처리를하고 길이가 같으면 1로 처리한다


참고

https://kldp.org/node/126284

정사각형 판별 문제입니다. | KLDP

네개의 점(w,x,y,z)의 좌표(x,y)가 주어졌을 때, 이 점들을 이은 도형이 정사각형인지 판펼하는 소스를 C언어로 작성하라는 문제인데.... 아 생각보다 엄청 어렵네요;; 정사각형의 수학적 정의, 4변이

kldp.org

 
 
 

저작자표시 (새창열림)

'정리 전 게시글 > 공부 관련' 카테고리의 다른 글

[백준 1969번 문제, Python3] DNA  (0) 2023.03.29
BFS, DFS, 최선우선탐색, 휴리스틱 알고리즘, a* 알고리즘 3X3 8퍼즐 공부  (0) 2023.03.26
자바 양방향 그래프 dfs - 2차원 행렬, 반복문, 스택, LinkedHashSet  (0) 2023.03.21
운영체제 (1) ~ (3) 주차 학습 노트  (0) 2023.03.20
[프로그래머스 1Level, Java] 신고 결과 받기  (0) 2023.03.17
'정리 전 게시글/공부 관련' 카테고리의 다른 글
  • [백준 1969번 문제, Python3] DNA
  • BFS, DFS, 최선우선탐색, 휴리스틱 알고리즘, a* 알고리즘 3X3 8퍼즐 공부
  • 자바 양방향 그래프 dfs - 2차원 행렬, 반복문, 스택, LinkedHashSet
  • 운영체제 (1) ~ (3) 주차 학습 노트
aptenia
aptenia
공부하면서 배운 것들
  • aptenia
    새벽의 아이디어
    aptenia
  • 전체
    오늘
    어제
    • 분류 전체보기 (279)
      • 논문 (0)
      • Roboracer (2)
      • 개발 아무거나 (1)
      • 일상 아무거나 (2)
      • 정리 전 게시글 (268)
        • 개발 관련 (25)
        • 정보 관련 (19)
        • 공부 관련 (224)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 네이버 블로그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스크롤바CSS
    프로그래머스
    백준
    마인크래프트스크립트
    자바
    마크스크립트
    파이썬
    c언어초보
    티스토리스킨편집
    마크
    C++강좌
    마인크래프트강화스크립트
    파이어베이스
    컨텍스트스위칭
    프로그래머스PCCE
    마인크래프트
    일본규슈공업대학교
    공개SW개발자대회
    이것이자바다연습문제
    콜라츠추측
    이것이자바다확인문제
    빅데이터공모전
    티스토리HTML
    안드로이드
    티스토리반응형2스킨편집
    이것이자바다
    캡스톤디자인
    반복하지않는수
    C언어
    C언어강좌
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
aptenia
[백준 1485번 문제, Python3] 정사각형
상단으로

티스토리툴바