2a2aq   11달 전

이 코드가 보완해서 고칠 수 있는 것인지는 모르겠지만, 최소한 왜 틀렸는지는 알고 싶습니다.


설명을 좀 하자면, 먼저 p1과 p2에 좌표를 받고, 만약 어떤 선분에 대해 이 선분의 양 끝점의 x좌표가 같지 않다면

이 선분을 포함하는 직선 y= a[i] * x+ b[i]를 찾아 a[i] , b[i]를 저장합니다. 그리고 이것이 가능한 경우 error값이 1, 양 끝점의 x좌표

값이 같았다면 error값이 0이 됩니다.

그뒤 for문을 돌려서 쌍별로 겹치는지 확인하는데, 이는 문제에서 3선분이 1점에서 만나지 않는다고 했기 때문에 가능합니다.

두 선분 모두 기울기가 유한한 경우, 선분 I와 J 모두 기울기가 무한인 경우, 둘 중 하나가 무한인 경우로 나누어서 생각합니다.

두 선분 모두 기울기가 유한하면 먼저 두 선분의 x좌표 범위가 겹치는지 확인, 그뒤 직선 J와 선분 I가 겹치는지 확인하는데,

만약 겹친다면 선분 I의 양 끝점 중 하나가 직선 J 상에 있거나, 두 점 중 하나는 직선 J 아래에 있고 하나는 직선 위에 있어 겹치는 구조

둘 중 하나일 것이므로  (참고로 직선 상에 있다는 것은 직선의 일부라는 뜻이고, 직선 위 아래는 그래프를 그렸을 때  y값의 크거나 작아 위 또는 아래에 있다는 뜻입니다.)  ( a[j] * p1[i][0] + b[j] - p1[i][1] ) * ( a[j] * p2[i][0] + b[j] - p2[i][1] ) 가 0이거나 음수여야 합니다. 이 식 뒤에 있는 -0.0001은 오차 보정을 위해서입니다. 그뒤 직선 I가 선분 J와 겹치는지 확인하고 맞다면 num(출력할 값) 을 증가시킵니다.

두 선분 모두 기울기가 무한하다면 평행하거나 한 점에서 만날 것인데( 문제에서 선분끼리 길이를 공유하지는 않는다고 했습니다.)

그러므로 양 끝점이 겹치는지만 확인하면 됩니다.

둘 중 하나만 무한한 경우 둘 다 유한할 때와 같은 논리로

( p1[i][1] - ( a[j] * p1[i][0] + b[j] ) ) * ( p2[i][1] - ( a[j] * p1[i][0] + b[j] )가 0이거나 음수여야 하고,

(p1[i][0]-p1[j][0])*(p1[i][0]-p2[j][0])<=0  x좌표 범위가 일치한다는 것을 확인하기 위해 왼쪽 식을 사용하여 확인합니다.

조금 설명이 복잡하지만 꼭 도와주셨으면 합니다.


댓글을 작성하려면 로그인해야 합니다.