2014년 7월 16일 수요일

2987 사과나무

삼각형의 세 좌표가 주어졌을 때, 삼각형의 넓이와 그 다음에 주어지는 좌표가 삼각형 내부에 있는지 없는지를 알아내는 문제이다.

세 좌표로 삼각형의 넓이를 구하는 공식은 다음과 같다.
|xA(yB-yC)+xB(yC-yA)+xC(yA-yB)| / 2

내가 푼 방법은 넓이는 저 공식대로 구하고, 내부 외부 판별은, 삼각형을 세 직선으로 구분해서 삼각형의 무게중심의 좌표를 각 직선에 대입해본다.
그러면 그 값의 부호를 알 수 있는데, 음수이면 그 직선보다 아래, 양수이면 그 직선보다 위에 있다는 뜻이다. 무게중심과 세 직선과의 부호 관계를 알아낸 후, 나중에 받아온 좌표를 똑같은 방법으로 비교했을 때 부호관계가 무게중심때와 같았다면 내부, 아니면 외부로 판단해 주었다.
단, 직선의 경계에 있어도 내부이기 때문에 값이 0일 때도 따로 처리해 주어야 한다.

이렇게 하면 답을 구할수는 있지만, 사실 직선을 구성할 때 기울기의 분모가 0이 되는 경우가 있다. 이것도 따로 처리해주어야 되는데 혹시나 해서 그냥 제출해 보았더니 정답이 떴다.
테스트 케이스가 적어서 그런가해서 따로 분모가 0이 되게끔 좌표를 넣어줘 봤는데
분명 런타임 에러가 뜰것으로 예상했으나 에러는 커녕 결과까지 제대로 나왔다... 이유는 잘 모르겠다. double형이라 그런거 같은데, 부동 소숫점에 대해 제대로 알아봐야 할 것 같다.

사실 이것보다 훨씬 편한 방법이있는데, 다른 사람의 소스를 보고나서야 알았다.
그 방법은 따로 받아온 점과 삼각형의 두개의 점을 고른 세 삼각형의 넓이의 합이 원래 삼각형의 넓이와 같으면 내부, 다르면 외부인 것이다.

역시 수학은 잘하고 봐야 한다..

소스

댓글 없음:

댓글 쓰기