백준 1064번 문제 바로가기

내 풀이

삼각형의 각 변의 길이를 구하고, 이를 통해서 만들어낸 평행사변형의 둘레의 (최댓값-최솟값)을 구하는 문제. 예제를 이상없이 모두 통과했지만, 실제로 제출해보니 틀렸습니다 에러가 발생해서 많이 당황했다. 크게 바꾼 부분은 다음 두가지다.

  1. 세 점이 한 직선상에 있는지 파악하기
    • 세 점이 한 직선상에 있다면 평행사변형을 만들지 못하므로 -1을 출력해야 한다. 제2코사인 법칙을 이용해도 되고, CCW을 이용해서 풀어도 된다.
  2. 계산의 정확도
    • 소숫점 자릿수를 고려해줘야하는 문제였다. 오차 범위가 $ < 10^{-9} $ 이므로 double을 사용하고 cout으로 출력하기 전에 cout.precision(20)와 같이 정확도를 우선 지정해주어야 한다.
    • 자꾸만 틀렸던 이유가 바로 여기에 있었다…
#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;
}