내 풀이
삼각형의 각 변의 길이를 구하고, 이를 통해서 만들어낸 평행사변형의 둘레의 (최댓값-최솟값)을 구하는 문제. 예제를 이상없이 모두 통과했지만, 실제로 제출해보니 틀렸습니다
에러가 발생해서 많이 당황했다. 크게 바꾼 부분은 다음 두가지다.
- 세 점이 한 직선상에 있는지 파악하기
- 세 점이 한 직선상에 있다면 평행사변형을 만들지 못하므로
-1
을 출력해야 한다. 제2코사인 법칙을 이용해도 되고, CCW을 이용해서 풀어도 된다.
- 세 점이 한 직선상에 있다면 평행사변형을 만들지 못하므로
- 계산의 정확도
- 소숫점 자릿수를 고려해줘야하는 문제였다. 오차 범위가 $ < 10^{-9} $ 이므로 double을 사용하고 cout으로 출력하기 전에
cout.precision(20)
와 같이 정확도를 우선 지정해주어야 한다. - 자꾸만 틀렸던 이유가 바로 여기에 있었다…
- 소숫점 자릿수를 고려해줘야하는 문제였다. 오차 범위가 $ < 10^{-9} $ 이므로 double을 사용하고 cout으로 출력하기 전에
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
double a1, a2, b1, b2, c1, c2;
cin >> a1 >> a2 >> b1 >> b2 >> c1 >> c2;
double x, y, z;
x = sqrt(pow(b2-a2, 2) + pow(b1-a1, 2));
y = sqrt(pow(c2-b2, 2) + pow(c1-b1, 2));
z = sqrt(pow(a2-c2, 2) + pow(a1-c1, 2));
vector<double> vec = {2*(x+y), 2*(y+z), 2*(z+x)};
// using CCW if three dots are on a single line
if ((b1-a1)*(c2-a2) == (c1-a1)*(b2-a2)){
cout << -1;
return 0;
}
double ans;
ans = *max_element(vec.begin(), vec.end()) - *min_element(vec.begin(), vec.end());
cout.precision(20);
cout << ans;
return 0;
}