https://www.acmicpc.net/problem/11758
11758번: CCW
첫째 줄에 P1의 (x1, y1), 둘째 줄에 P2의 (x2, y2), 셋째 줄에 P3의 (x3, y3)가 주어진다. (-10,000 ≤ x1, y1, x2, y2, x3, y3 ≤ 10,000) 모든 좌표는 정수이다. P1, P2, P3의 좌표는 서로 다르다.
www.acmicpc.net
문제요약:
세점이 주저지고 이를 이을 때, 시계방향인지 반시계방향인지 판단하라
소요시간:
20분
난이도:
골드 5
제출횟수:
2회
1차코딩:
x1,y1 = map(int,input().split())
x2,y2 = map(int,input().split())
x3,y3 = map(int,input().split())
piv = ((y2-y1)/(x2-x1))*(x3-x1) +y1-y3
print(-1 if piv>0 else 1 if piv<0 else 0)
처음에는 직선의 방정식을 이용해서 구현하려 했지만, 기울기를 구하는 과정에서 zero/divsion 문제가 발생했고, 이를 해결하기위해 예외처리를 하다보니 코드가 간결하지 못하고 가독성이 떨어졌습니다. 그래서 참고하여 새로 만든 코드가 다음과 같습니다.
2차코딩:
x1,y1 = map(int,input().split())
x2,y2 = map(int,input().split())
x3,y3 = map(int,input().split())
vx1,vy1 = x2-x1,y2-y1
vx2,vy2 = x3-x2,y3-y2
piv = vx2*vy1 - vx1*vy2
print(-1 if piv >0 else 1 if piv !=0 else 0)
다음은 외적을 이용한 풀이이며, z값이 0이기 때문에 공식중 다음만 남게되고, 훨씬 깔끔하게 풀 수 있었습니다.