코드
from itertools import combinations
def solution(dots):
answer = 0
combi = list(combinations(dots, 2)) # 네 점에서 두 개씩 조합
# 조합의 결과는 정렬되어 나오기 때문에 대칭으로 짝을 이룸 -> 그러므로 절반까지만 for문
for i in range(len(combi)//2):
dx1, dy1 = combi[i][0][0] - combi[i][1][0], combi[i][0][1]-combi[i][1][1]
dx2, dy2 = combi[-(i+1)][0][0]-combi[-(i+1)][1][0], combi[-(i+1)][0][1]-combi[-(i+1)][1][1]
d1 = dy1/dx1 # 직선1 기울기
d2 = dy2/dx2 # 직선2 기울기
if d1 == d2: # 두 직선의 기울기가 같으면(=평행) 1
answer = 1
break
answer = 0 # 어떠한 경우에도 평행하지 않으면 0
return answer
4개의 점의 좌표를 가지고 있는 리스트 dots가 주어지면, 점을 두 개씩이었을 때 만들어지는 두 직선이 평행한 지 판별하는 문제이다.
먼저, 4개의 점에서 2개의 점을 선택하기 위해 조합을 사용하였다.
dots는 [[1, 4], [9, 2], [3, 8], [11, 6]]와 같이 2차원 배열로 주어지기 때문에 2차원 배열에서 itertools의 combinations를 사용하면 ([1, 4], [9, 2]) 이런 형태로 결과가 나오게 된다.
또한 combinations의 결과는 정렬되어 나오기 때문에 0번째 인덱스에 위치한 두 좌표는 마지막 인덱스에 위치하는 두 좌표와 한 쌍이 될 수 있다.
여기서 한 쌍이라는 의미는 ([1, 4], [9, 2]) 가 선택되고 남은 나머지 두 좌표를 의미하는 것이다.
0번 인덱스는 5번 인덱스(-1번 인덱스)와
1번 인덱스는 4번 인덱스(-2번 인덱스)와
2번 인덱스는 3번 인덱스(-3번 인덱스)와
한 쌍이라고 볼 수 있다.
그래서 dx, dy를 구하는 과정에서 인덱스 접근을 -(i+1)로 하게 된 것이다.
두 직선이 평행한 지 판별하기 위해서는 기울기가 같아야 한다.
따라서 combi의 0번 인덱스에 위치한 두 좌표의 x값은 x값끼리 y값은 y값끼리 빼서 dx1, dy1에 저장해 주고, -1번 인덱스에 위치한 두 좌표의 x값은 x값끼리 y값은 y값끼리 빼서 dx2, dy2에 저장해 주었다.
직선의 기울기는 $\frac{dy}{dx}$ 이므로 각각의 기울기를 구해 d1, d2로 저장해 두 기울기가 같은 지 비교하였다.
기울기가 같으면 평행한 두 직선이므로 answer = 1을 해준다. 이때, break를 하는 이유는 두 직선이 평행이 되는 경우가 한 번만 있어도 1을 리턴하기 때문이다.
만약 이번 요소가 평행이어서 answer = 1로 바꿨지만, combi의 다음 요소가 평행이 아닐 경우 다시 answer=0이 되기 때문에 1이 되면 이후의 경우는 생각하지 않고 반복문을 종료해 주는 것이다.
dots에는 4개의 점만 있다고 명시되어 있기 때문에 두 직선을 만들 수 있는 경우의 수는 12/34 13/24 14/23 세 가지뿐이다. 그렇기 때문에 변수나 반복문 없이 직접 기울기를 구해봐도 된다.