Eat the ENAK

BOJ3009 - 네 번째 점 본문

PS: Problem Solving/BOJ: 백준온라인저지

BOJ3009 - 네 번째 점

으낙 2019. 10. 29. 11:40

문제 바로가기

https://www.acmicpc.net/problem/3009

Solved.ac* 난이도

* Solved.ac는 백준 온라인 저지의 문제들에 난이도를 매겨주는 서비스입니다. 자세한 내용은 홈페이지를 참고해주세요.

 


본문


해설

https://github.com/return0927/CodingWrite-UP/blob/master/BOJ/3009/3009.py

 

입력으로 직사각형의 세 점의 좌표를 주는데, 이 세 점은 항상 직교하는 두 선분을 이룬다. 직사각형이기 때문에 마주보는 두 쌍의 변은 서로 길이가 같고 평행하다. 각각의 점을 원점을 시점으로 하는 위치벡터로 생각하면, 직교하는 두 선분의 교점에 해당하는 공통의 점을 구한 후, 둘 중 아무 점까지의 벡터를 구해, 나머지 하나의 점에 그 벡터를 더해주면 된다.

 

따라서 먼저 벡터 객체를 구현해준다.

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return 'Vector({})'.format(self)

    def __str__(self):
        return '{}, {}'.format(self.x, self.y)

    @property
    def len(self) -> float:
        return (self.x**2 + self.y**2)**.5

    def __sub__(self, other):
        return Vector(self.x - other.x, self.y - other.y)

    def __add__(self, other):
        return Vector(self.x + other.x , self.y + other.y)

파이썬에서 클래스를 자주 다뤄본 사람이면 쉽게 이해할 수 있을 것이다.

조금만 첨언하자면 __repr__, __str__은 그 객체를 설명하는 문자열인데, 디버깅을 위해 정의했다.

속성 len은 원래 __len__으로 정의해서 len(object)로 구하려했으나, len()의 리턴형식은 int밖에 안된단다. 벡터의 길이가 항상 정수일리는 없으니 object.len으로 정의해버렸다.

__sub__, __add__는 두 벡터간의 합/차 연산을 위해 정의했다.

 

이후 입력받은 세 점을 위치벡터로 변환해주고

A = Vector(*[int(x) for x in input().split(' ')])
B = Vector(*[int(x) for x in input().split(' ')])
C = Vector(*[int(x) for x in input().split(' ')])

 

가운데 끼인 점을 찾기 위해 대각선에 해당하는 변의 길이를 찾아준다.

AB = (A - B).len
BC = (B - C).len
AC = (A - C).len
diagonal = max(AB, BC, AC)

 

만약 diagonal = AB이면 AB가 직사각형의 대각선에 해당하므로 C가 끼인점이 된다. 이런 식으로 끼인점을 구하면 마지막 점 last는 A + (B - C)로 구할 수 있다. B - C가 한 점으로 향하는 벡터이고, A에 더하면 마지막 점이 나온다.

 

 

 

'PS: Problem Solving > BOJ: 백준온라인저지' 카테고리의 다른 글

BOJ1929 - 소수 구하기  (0) 2019.10.29
BOJ1085 - 직사각형에서 탈출  (0) 2019.10.29
BOJ4153 - 직각삼각형  (0) 2019.10.28
BOJ3053 - 택시 기하학  (0) 2019.10.28
BOJ1002 - 터렛  (0) 2019.10.28
Comments