공부하기/백준

[Python] 백준 풀기 11758 - CCW

XEV 2022. 11. 15. 23:34

파이썬 백준 11758번

골드5

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

 

11758번: CCW

첫째 줄에 P1의 (x1, y1), 둘째 줄에 P2의 (x2, y2), 셋째 줄에 P3의 (x3, y3)가 주어진다. (-10,000 ≤ x1, y1, x2, y2, x3, y3 ≤ 10,000) 모든 좌표는 정수이다. P1, P2, P3의 좌표는 서로 다르다.

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 기하학

 

 

 

 

 

문제 풀기

처음에는 점 p2 를 기준으로 p1 과 p3 에 대한 기울기 관계를 이용해 풀려고 하였다. 이때, 일반적으로 마구잡이 놓여있을 땐 상관이 없었는데 x 의 좌표가 같아지는 상황에서는 분모가 0 이 되어버려 또 다른 if 조건이 만들어져야 했다.

if 조건을 줄줄이 달아 풀려고 하다가 이건 아니다 싶어 풀이를 찾아보았다.

 

풀이에서는 벡터를 이용하였다. 위에서 언급한 접근 과정에서 세 점에 대한 원으로 접근하던가 벡터로 접근하는 것에 생각은 하였으나 머릿속에서 좀처럼 식으로 만들어지지 않았다.

여튼, 벡터의 외적으로 풀이를 하는 것을 알았으나.. 그래도 모르겠다. 벡터를 다 까먹었다.

이 문제를 통해 벡터의 내적과 외적에 대해 다시 찾아보고 기억을 되살릴 수 있었다.

 

p2 와 다른 한 점이 이루는 직선의 방향벡터를 각각 구하고 2 by 2 행렬식의 determinat 구하는 것처럼 계산을 하여 그것이 1, 0,. -1 에 해당하는 경우에 대해 출력을 한다.

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline

def fnCcwCw(point_ls):
    vector1 = [point_ls[1][0] - point_ls[0][0], point_ls[1][1] - point_ls[0][1]]
    vector2 = [point_ls[2][0] - point_ls[1][0], point_ls[2][1] - point_ls[1][1]]
    determinant = (vector1[0] * vector2[1] - vector1[1] * vector2[0])
    
    if determinant > 0:
        print(1)
    elif determinant == 0:
        print(0)
    elif determinant < 0:
        print(-1)


if __name__ == "__main__":
    point_ls = [list(map(int, inputdata().split())) for _ in range(3)]
    # print(point_ls)
    
    fnCcwCw(point_ls)

 

 

 

 

 

추가 하기

기울기를 이용하여 구하고자 한 코드

두 점이 이루는 x의 좌표가 같을 때 분모가 0 이 되어 이때 필요한 if 조건문이 지저분하게 많이 추가될 거 같아 중지한 코드.

import sys
inputdata = sys.stdin.readline

def fnCcwCw(point_ls):
    if point_ls[0][0] == point_ls[1][0] == point_ls[2][0]:
        print(0)
    elif point_ls[1][0] - point_ls[0][0] == 0:
        if (point_ls[2][1] - point_ls[0][1]) / (point_ls[2][0] - point_ls[0][0]) < 0:
            print(1)
        elif (point_ls[2][1] - point_ls[0][1]) / (point_ls[2][0] - point_ls[0][0]) > 0:
            print(-1)
    elif point_ls[2][0] - point_ls[0][0] == 0:
        if (point_ls[1][1] - point_ls[0][1]) / (point_ls[1][0] - point_ls[0][0]) > 0:
            print(1)
        elif (point_ls[1][1] - point_ls[0][1]) / (point_ls[1][0] - point_ls[0][0]) < 0:
            print(-1) 
    else:
        p2p1 = (point_ls[1][1] - point_ls[0][1]) / (point_ls[1][0] - point_ls[0][0])
        p3p1 = (point_ls[2][1] - point_ls[0][1]) / (point_ls[2][0] - point_ls[0][0])
        print(p2p1)
        print(p3p1)
        
        if p2p1 == p3p1:
            print(0)
        elif p2p1 < p3p1:
            print(1)
        elif p2p1 > p3p1:
            print(-1)


if __name__ == "__main__":
    point_ls = [list(map(int, inputdata().split())) for _ in range(3)]
    print(point_ls)
    
    fnCcwCw(point_ls)

 

 

https://ko.wikipedia.org/wiki/%EC%99%B8%EC%A0%81#:~:text=%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99%EC%97%90%EC%84%9C%20%EC%99%B8%EC%A0%81(%E5%A4%96%E7%A9%8D,%EA%B0%80%20%EB%82%98%EC%98%A4%EC%A7%80%20%EC%95%8A%EA%B8%B0%20%EB%95%8C%EB%AC%B8%EC%9D%B4%EB%8B%A4.

 

외적 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 이 문서는 벡터끼리 곱하면 행렬을 얻게 되는 ‘외적’(outer product)에 관한 것입니다. 벡터끼리 곱하면 벡터를 얻게 되는 ‘외적’(cross product)에 대해서는 벡터

ko.wikipedia.org

 

https://en.wikipedia.org/wiki/Cross_product

 

Cross product - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Mathematical operation on vectors in 3D space In mathematics, the cross product or vector product (occasionally directed area product, to emphasize its geometric significance) is a bin

en.wikipedia.org