[BOJ/C++] 11758(CCW)

푸른별·2023년 9월 29일
0

Algorithm

목록 보기
43/47
post-thumbnail

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

2. 풀이 과정

  1. 솔직히 몰라서 진짜 하드코딩했는데, 그래도 틀리길래 그냥 외적 상기할 겸 검색했습니다. 그랬더니 Counter Clock Wise라는 알고리즘이 있더군요.
  • CCW는 직역하면 시계 반대 방향을 의미합니다. Clock Wise가 시계 방향을 뜻하니 시계 방향 및 반시계 방향에 대한 문제라고 유추할 수 있습니다.

  • 행렬을 배웠다는 가정 하에 풀이할 수 있다고 생각합니다. 만약 행렬을 배운 적이 없다면 한 번 인터넷에서 찾아보는 걸 추천합니다.(기하 및 선형대수학 등 다양한 분야에서 많이 사용합니다.)

  1. 세 점을 사용하여 두 벡터를 만들어줍니다.
    (x1을 시점으로 해야 하므로 x1,x2와 x1,x3을 연산하면 됩니다.
  2. 이렇게 만들어진 두 벡터를 행렬화하여 외적한 값을 계산합니다.
  3. 각 벡터의 내적값을 (V1x, V1y), (V2x,V2y)라 하면,
    det(A) = (V1x V2y) - (V2x V1y)가 되고, 해당 값을 기반으로 이후의 연산(판별)을 진행하면 됩니다.

3. 정답 코드

#include<iostream>
using namespace std;

int X1, X2, X3, Y1, Y2, Y3;

void input() {
	cin >> X1 >> Y1 >> X2 >> Y2 >> X3 >> Y3;
}

int countClockWise() {
	int num = X1 * Y2 + X2 * Y3 + X3 * Y1;
	num -= Y1 * X2 + Y2 * X3 + Y3 * X1;
	 
	if (num > 0) return 1;
	else if (num < 0) return -1;
	else return 0;
}

void solution() {
	input();
	cout << countClockWise();
}

int main() {
	cin.tie(0), cout.tie(0);
	ios_base::sync_with_stdio(0);
	solution();
	return 0;
}

4. Reference

https://gaussian37.github.io/math-algorithm-ccw/

profile
묵묵히 꾸준하게

0개의 댓글