반응형
이 문제는 CCW(Counter-Clockwise) 공식을 알고있는지 물어보는 문제입니다.
이 공식을 이용하면 시계 반대방향으로 회전하는지 확인할 수 있습니다.
CCW 공식은 아래와 같습니다.
CCW = (A.x*B.y + B.x*C.y + C.x*A.y) - (A.x*C.y + B.x*A.y + C.x*B.y)
A, B 벡터를 기준으로 C벡터가 왼쪽 방향에 위치한지 오른쪽 방향에 위치한지 알 수 있으며
시계 방향일 경우 0보다 작은 값이 나오고
반시계 일 경우에는 0보다 큰 값이 나옵니다.
세 벡터가 일직선에 놓인 경우에는 결과값으로 0이 나옵니다.
풀이법
11758번 문제는 3개의 벡터 x,y값을 입력받고
시계 방향을 나타내면 1, 반시계는 -1, 일직선을 0을 출력하면 되는 문제입니다.
CCW를 입력받고 -1 ~ 1로 clamp하여 출력하면 되겠습니다.
정답 코드
int main()
{
int v[3][2];
for (int i = 0; i < 3; i++)
{
int a, b;
cin >> a >> b;
v[i][0] = a;
v[i][1] = b;
}
int result = (v[0][0]*v[1][1] + v[1][0]*v[2][1] + v[2][0]*v[0][1])
- (v[0][0]*v[2][1] + v[1][0] * v[0][1] + v[2][0] * v[1][1]);
result = result > 0 ? 1 : result < 0 ? -1 : 0;
cout << result << "\n";
}
반응형
LIST
'알고리즘 문제 > 백준' 카테고리의 다른 글
2162 선분 그룹 (기하학) [Platinum V] (0) | 2024.05.18 |
---|---|
17387 선분 교차 2(기하학) [Gold II] (1) | 2024.05.16 |
11049 행렬 곱셈 순서 (동적계획법) [Gold III] (0) | 2024.05.13 |
1915 가장 큰 정사각형 (동적계획법) [Gold IV] (0) | 2024.05.09 |
13398 연속합2 (동적계획법) [Gold V] (0) | 2024.05.07 |