Eat the ENAK
BOJ3009 - 네 번째 점 본문
문제 바로가기
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 |