문제 개요
서로 다른 좌표 값을 가진 세 개의 점이 주어졌을 때, 이 점들이 공선(collinear)인지 아닌지 판별해야 합니다.
세 점이 모두 같은 직선 위에 있으면 '공선점'이라고 부르고, 각기 다른 직선 위에 있다면 공선점이 아니라고 합니다. 아래 그림은 공선점과 비공선점의 예를 보여줍니다.

입력
x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5
출력
no points are not collinear
입력
x1 = 1, y1 = 1, x2 = 1, y2 = 4, x3 = 1, y3 = 5
출력
points are collinear
핵심 원리: 삼각형의 넓이
세 점으로 삼각형을 만들 수 없다면, 즉 세 점이 이루는 삼각형의 넓이가 0이라면 세 점은 한 직선 위에 있는 것입니다. 반대로 넓이가 0이 아니라면 세 점은 서로 다른 직선 위에 있는 것이므로 공선점이 아닙니다. 따라서 다음 공식으로 계산한 값이 0인지만 확인하면 됩니다.
x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)
프로그램의 접근 방식
- 점을 (x1, y1), (x2, y2), (x3, y3) 형태로 입력받습니다.
- 삼각형 넓이 공식 x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)를 적용합니다.
- 다음 조건을 검사합니다.
- 삼각형의 넓이가 0이면 "점들은 공선점입니다"를 출력합니다.
- 삼각형의 넓이가 0이 아니면 "점들은 공선점이 아닙니다"를 출력합니다.
- 최종 결과를 출력합니다.
알고리즘
시작
단계 1→ 점들의 공선 여부를 확인하는 함수 선언
void check_collinear(int x1, int y1, int x2, int y2, int x3, int y3)
int a = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2) 선언
IF (a == 0)
"yes points are collinear" 출력
End
Else
"no points are not collinear" 출력
단계 2→ main() 함수에서
int x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5 선언
check_collinear(x1, y1, x2, y2, x3, y3) 호출
종료예제 코드
#include <bits/stdc++.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
//점들이 공선점인지 확인하는 함수
void check_collinear(int x1, int y1, int x2, int y2, int x3, int y3){
int a = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2);
if (a == 0)
cout << "yes points are collinear";
else
cout << "no points are not collinear";
}
int main(){
int x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5;
check_collinear(x1, y1, x2, y2, x3, y3);
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
no points are not collinear
즉, (1, 1), (2, 4), (3, 5) 세 점은 계산된 값이 0이 아니므로 한 직선 위에 있지 않습니다. 만약 세 점이 같은 직선 위에 있다면 계산 결과가 0이 되어 "points are collinear"가 출력됩니다.