[백준 C++] 11758번 CCW
백준 11758번 CCW c++로 풀이
[백준 C++] 11758번 CCW
11758번: CCW
문제 요약
문제
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을 출력한다. ``` 예제1
입력 1 1 5 5 7 3 출력 -1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
## 풀이
p1과 p3을 잇는 직선의 방정식을 구한 다음에 여기에 p2의 x값을 넣고 y가 위쪽에 있는지 아래에 있는지로 판별하면 된다. 이때 p1과 p3의 방향에 따라 정답이 달라진다.
## 어려웠던 점
처음에 직선의 방정식을 x로 해야 풀린다고 생각하여 괜히 복잡하게 했다.
## 배운 점 / 느낀 점
## 전체 코드
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct p{
int x, y;
};
p l(p p1, p p2){
return {p2.x-p1.x, p2.y-p1.y};
}
int n;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
p p1, p2, p3;
cin >> p1.x >> p1.y;
cin >> p2.x >> p2.y;
cin >> p3.x >> p3.y;
p l1 = l(p1, p3);
if(l1.y == 0){
if(l1.x > 0){
if(p2.y > p1.y){
cout << 1;
}
else if(p2.y < p1.y){
cout << -1;
}
else{
cout << 0;
}
}
else{
if(p2.y > p1.y){
cout << -1;
}
else if(p2.y < p1.y){
cout << 1;
}
else{
cout << 0;
}
}
return 0;
}
int x = (p2.y-p1.y)*l1.x/l1.y+p1.x;
if(l1.y > 0){
if(x < p2.x){
cout << 1;
}
else if(x > p2.x){
cout << -1;
}
else{
cout << 0;
}
}
else{
if(x < p2.x){
cout << -1;
}
else if(x > p2.x){
cout << 1;
}
else{
cout << 0;
}
}
return 0;
}
This post is licensed under CC BY 4.0 by the author.