파이썬 백준 11758번
골드5
https://www.acmicpc.net/problem/11758
문제 보기
분류: 기하학
문제 풀기
처음에는 점 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://en.wikipedia.org/wiki/Cross_product
'공부하기 > 백준' 카테고리의 다른 글
[Python] 백준 풀기 11724 - 연결 요소의 개수 (0) | 2022.11.17 |
---|---|
[Python] 백준 풀기 2667 - 단지번호붙이기 (0) | 2022.11.16 |
[Python] 백준 풀기 1018 - 체스판 다시 칠하기 (0) | 2022.11.14 |
[Python] 백준 풀기 1012 - 유기농 배추 (0) | 2022.11.13 |
[Python] 백준 풀기 2606 - 바이러스 (0) | 2022.11.12 |