문제 개요
좌표평면 위에 있는 두 점 A와 B의 좌표가 주어졌을 때, 이 두 점을 지나는 직선의 방정식을 구하는 프로그램을 C++로 작성하는 것이 이번 문제의 목표입니다.
문제 설명
직선을 찾기 위해서는 직선의 방정식을 활용하고, 주어진 두 점의 좌표를 대입하여 계수를 구해야 합니다.
예시를 통해 문제를 이해해 보겠습니다−
- 입력: A = (3, 3), B = (6, 1)
- 출력: 2x + 3y = 15
풀이 접근 방법
직선의 방정식을 구하기 위해 다음과 같은 일반형 방정식을 사용합니다.
ax + by = c
이 방정식은 두 점 A(x1, y1)와 B(x2, y2) 모두를 만족해야 하므로, 각각의 점을 대입하면 다음 두 식을 얻을 수 있습니다.
ax1 + by1 = c
ax2 + by2 = c
여기서 c는 두 식에 공통으로 포함되어 있으므로, 두 식을 서로 같다고 놓으면 다음과 같이 정리됩니다.
ax1 + by1 = ax2 + by2
⇒ a(x1 − x2) = b(y2 − y1)
이 관계식으로부터 각 계수를 다음과 같이 구할 수 있습니다.
a = (y2 − y1)
b = (x1 − x2)
마지막으로 c는 첫 번째 점의 좌표를 대입한 식을 통해 구합니다.
c = a·x1 + b·y1
정리하면, 두 점을 지나는 직선의 방정식 계수는 다음과 같습니다.
a = (y2 − y1)
b = (x1 − x2)
c = a·x1 + b·y1
참고로 위 예시 입력 A = (3, 3), B = (6, 1)에 공식을 적용하면 a = −2, b = −3, c = −15가 되고, 양변에 −1을 곱해 정리하면 출력 결과인 2x + 3y = 15와 일치함을 확인할 수 있습니다.
예제 코드
#include <iostream>
using namespace std;
void findLine(int points[2][2]) {
int a = points[1][1] - points[0][1];
int b = points[0][0] - points[1][0];
int c = a * points[0][0] + b * points[0][1];
cout << "(" << a << "x) + (" << b << "y) = (" << c << ")";
}
int main() {
int points[2][2] = {{5, 9}, {1, 4}};
cout << "The equation of line is ";
findLine(points);
return 0;
}
실행 결과
The equation of line is (-5x) + (4y) = (11)
코드 설명
위 코드는 2×2 배열에 저장된 두 점의 좌표를 findLine 함수에 전달합니다. 함수 내부에서 앞서 유도한 공식대로 a, b, c를 차례로 계산한 뒤, 직선의 방정식 형태로 출력합니다.
예제에서 사용된 두 점은 (5, 9)와 (1, 4)입니다. 공식에 대입하면 a = 4 − 9 = −5, b = 5 − 1 = 4, c = (−5)×5 + 4×9 = 11이 되어, 실행 결과인 −5x + 4y = 11이 도출됩니다.
이 알고리즘은 단순한 사칙연산만 수행하므로 시간 복잡도는 O(1)이며, 어떤 두 점이 주어지더라도 상수 시간 안에 직선의 방정식을 구할 수 있습니다.