Post

BOJ 11758 CCW

BOJ 11758 CCW

문제

점 3개 주어질때 선분의 방향을 구하면 된다.
주어지는 선분을 순서대로 이었을때 반시계라면 1, 시계라면 -1, 일직선이면 0

접근법

벡터 행렬식의 부호가 답이다.

풀이

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
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int INF = 1e9;
const ll LINF = 1e18;
const int MOD = 998244353; // or 1e9 + 7

#define rep(i, a, b) for (int i = (a); i < (b); ++i)
#define all(x) (x).begin(), (x).end()

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int x1,y1,x2,y2,x3,y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;

    int v1_x = (x2-x1);
    int v1_y = (y2-y1);
    int v2_x = (x3-x1);
    int v2_y = (y3-y1);

    int z = v1_x * v2_y - v1_y * v2_x;
    cout << (z>0)-(z<0);

    return 0;
}

1-2-3 점을 잇는 상황이다.
12 벡터, 13 벡터를 외적하고 구하면 된다.

나는 왜 2번 점을 중심으로 한 두 벡터라고 생각하고 있었는지 잘 모르겠다. 날먹 문제집에 있던 문제인데 하나 배워간다.

1-2-3 으로 이어지는 상황에서, 1-2 로 가다가 2-3으로 꺾이는 방향을 궁금해하는 것이다.
2번을 중심으로 잡으면 2-1 순서가 되어 가던 방향의 반대가 된다.

정수에서 부호 뽑아내기

1
cout << (z>0)-(z<0);

이게 정수에서 부호만 뽑아내는 방법이다.

This post is licensed under CC BY 4.0 by the author.