반응형
https://www.acmicpc.net/problem/1064
점 사이의 거리, 기울기를 이용해 평행사변형 생성가능 여부를 결정하는 수학 문제였습니다.
📕 풀이방법
📔 입력 및 초기화
점의 x,y좌표를 저장하기 위해 struct Point를 선언 합니다. Point a,b,c점을 선언 후 선분 ab, bc, ac를 의미하는 변수 abLen, bcLen, acLen, 둘레의 길이를 저장할 변수 len1, len2, len3을 선언 후 a, b, c의 좌표를 입력받습니다.
📔 풀이과정
1. 평행사변형이 될 수 없는 경우
두 선분의 기울기가 같은 경우입니다. ab, bc선분의 기울기를 getInclination함수를 수행해 같다면 -1.0을 출력 후 program을 종료합니다.
2. 평행사변형이 되는 경우
선분 ab, bc, ac의 길이를 getLength함수를 이용해 구한 뒤 저장해줍니다.
이 후 3개의 선분 중 2개를 이용해 평행사변형의 둘레길이를 구할 수 있습니다. 이를 len1, len2, len3에 맞춰 저장해줍니다.
📔 정답출력
len1, len2, len3의 최대와 최소 차이를 소숫점 16자리까지 출력해줍니다. 상대오차는 주로 출력예시 답에 나오는 소숫점 자리만큼 고려해주면 됩니다.
📕 Code
#include <bits/stdc++.h>
using namespace std;
struct Point{ double x,y; };
Point a, b, c;
double abLen, acLen, bcLen, len1, len2, len3;
double getLength(Point a, Point b){
double x = a.x - b.x;
double y = a.y - b.y;
return sqrt(x*x + y*y);
}
double getInclination(Point a, Point b){
return abs(a.y-b.y) / abs(a.x- b.x);
}
int main(){
cin >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y;
if(getInclination(a, b) == getInclination(b, c)) {cout << "-1.0"; return 0;}
abLen = getLength(a, b);
bcLen = getLength(b, c);
acLen = getLength(a, c);
len1 = (abLen + bcLen) * 2;
len2 = (acLen + bcLen) * 2;
len3 = (abLen + acLen) * 2;
printf("%.16f",max({len1, len2, len3}) - min({len1, len2, len3}));
}
'Algorithm > Math' 카테고리의 다른 글
(C++) - 백준(BOJ) 25191 : 치킨댄스를 추는 곰곰이를 본 임스 (0) | 2022.05.16 |
---|---|
(C++) - 백준(BOJ) 24860 : Couinting Antibodies (0) | 2022.05.11 |
(C++) - 백준(BOJ) 12871 : 무한 문자열 (2) | 2022.04.21 |
(C++) - 백준(BOJ) 24723 : 녹색거탑 (0) | 2022.03.30 |
(C++) - 백준(BOJ) 13301 : 타일 장식물 (0) | 2022.03.26 |