πŸ™‡β€β™€οΈ[Gold V] CCW - 11758

문제 링크

μ„±λŠ₯ μš”μ•½

λ©”λͺ¨λ¦¬: 2020 KB, μ‹œκ°„: 0 ms

λΆ„λ₯˜

κΈ°ν•˜ν•™

제좜 일자

2024λ…„ 6μ›” 9일 13:57:56

문제 μ„€λͺ…

2차원 μ’Œν‘œ 평면 μœ„μ— μžˆλŠ” 점 3개 P1, P2, P3κ°€ 주어진닀. P1, P2, P3λ₯Ό μˆœμ„œλŒ€λ‘œ 이은 선뢄이 μ–΄λ–€ λ°©ν–₯을 이루고 μžˆλŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 P1의 (x1, y1), λ‘˜μ§Έ 쀄에 P2의 (x2, y2), μ…‹μ§Έ 쀄에 P3의 (x3, y3)κ°€ 주어진닀. (-10,000 ≀ x1, y1, x2, y2, x3, y3 ≀ 10,000) λͺ¨λ“  μ’Œν‘œλŠ” μ •μˆ˜μ΄λ‹€. P1, P2, P3의 μ’Œν‘œλŠ” μ„œλ‘œ λ‹€λ₯΄λ‹€.

좜λ ₯

P1, P2, P3λ₯Ό μˆœμ„œλŒ€λ‘œ 이은 선뢄이 λ°˜μ‹œκ³„ λ°©ν–₯을 λ‚˜νƒ€λ‚΄λ©΄ 1, μ‹œκ³„ λ°©ν–₯이면 -1, 일직선이면 0을 좜λ ₯ν•œλ‹€.

πŸš€ν’€μ΄

CCW (Counter Clockwise) μ•Œκ³ λ¦¬μ¦˜μ€ 두 점을 μ§€λ‚˜λŠ” μ§μ„ μ˜ λ°©ν–₯을 ν™•μΈν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.
이 μ•Œκ³ λ¦¬μ¦˜μ€ 주둜 κΈ°ν•˜ν•™μ  λ¬Έμ œμ—μ„œ μ‚¬μš©λ˜λ©°, μ„ λΆ„κ³Ό 점, λ˜λŠ” μ„Έ 점의 μœ„μΉ˜ 관계λ₯Ό νŒλ‹¨ν•˜λŠ” 데에 ν™œμš©λ©λ‹ˆλ‹€.

주어진 μ„Έ 점 A, B, Cκ°€ μžˆμ„ λ•Œ, CCW μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μŒκ³Ό 같은 원리λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„Έ 점의 μœ„μΉ˜ 관계λ₯Ό ν™•μΈν•©λ‹ˆλ‹€:

AB 벑터와 AC λ²‘ν„°μ˜ 외적을 κ³„μ‚°ν•©λ‹ˆλ‹€.
μ™Έμ μ˜ κ²°κ³Όκ°€ μ–‘μˆ˜μΈ κ²½μš°μ—λŠ” 점 A, B, Cκ°€ λ°˜μ‹œκ³„ λ°©ν–₯으둜 μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄λ©λ‹ˆλ‹€.
이 경우 μ„Έ 점은 CCW κ΄€κ³„μž…λ‹ˆλ‹€.
μ™Έμ μ˜ κ²°κ³Όκ°€ 음수인 κ²½μš°μ—λŠ” 점 A, B, Cκ°€ μ‹œκ³„ λ°©ν–₯으둜 λ‚˜μ—΄λ©λ‹ˆλ‹€. 이 경우 μ„Έ 점은 CW κ΄€κ³„μž…λ‹ˆλ‹€.
μ™Έμ μ˜ κ²°κ³Όκ°€ 0인 κ²½μš°μ—λŠ” μ„Έ 점이 일직선 상에 μœ„μΉ˜ν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ CCW μ•Œκ³ λ¦¬μ¦˜μ€ 주둜 μ„ λΆ„ ꡐ차 μ—¬λΆ€ νŒλ‹¨, λ‹€κ°ν˜•μ˜ λ‚΄λΆ€ 점 νŒλ³„, 볼둝 λ‹€κ°ν˜•(Convex Hull) ꡬ성 λ“± λ‹€μ–‘ν•œ κΈ°ν•˜ν•™μ  λ¬Έμ œμ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

CCW μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μŒκ³Ό 같이 μˆ˜ν•™μ μœΌλ‘œ ν‘œν˜„λ  수 μžˆμŠ΅λ‹ˆλ‹€:

CCW(A,B,C)=(B.xβˆ’A.x)Γ—(C.yβˆ’A.y)βˆ’(B.yβˆ’A.y)Γ—(C.xβˆ’A.x)

μ—¬κΈ°μ„œ (B.xβˆ’A.x)Γ—(C.yβˆ’A.y) λŠ” AB 벑터와 AC λ²‘ν„°μ˜ μ™Έμ μ˜ z성뢄을 λ‚˜νƒ€λ‚΄λ©°, 이 값이 μ–‘μˆ˜μΈμ§€ μŒμˆ˜μΈμ§€μ— 따라 μ„Έ 점의 μœ„μΉ˜ 관계λ₯Ό νŒλ‹¨ν•©λ‹ˆλ‹€.

image

πŸš€μ½”λ“œ

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <climits>

using namespace std;

// 점 ꡬ쑰체
struct Point 
{
	int x, y;
};

// 두 점을 μ§€λ‚˜λŠ” μ§μ„ μ˜ λ°©ν–₯을 ν™•μΈν•˜λŠ” ν•¨μˆ˜
int ccw(Point A, Point B, Point C) 
{
	int cross_product = (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x);

	if (cross_product > 0) return 1;			// λ°˜μ‹œκ³„ λ°©ν–₯
	else if (cross_product < 0) return -1;		// μ‹œκ³„ λ°©ν–₯
	else return 0;  // 일직선
}

void solve()
{
	Point A, B, C;
	cin >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y;

	cout << ccw(A, B, C);
}

int main()
{
	FILE* stream;
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	freopen_s(&stream, "input.txt", "rt", stdin);

	solve();

	return 0;
}

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: