※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 6600번 문제인 원의 둘레이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/6600
좌표평면 위의 세 점이 주어졌을 때의 외접원의 반지름을 구하는 공식은 이곳(링크)에서 찾아볼 수 있다. 위 식을 이용해 원의 둘레를 계산하는 것으로 문제를 해결할 수 있다.
위와 같은 공식을 사용하지 않더라도 (1)외심의 성질을 이용해 수직이등분선의 교점을 계산하는 구현을 하거나 (2)사인법칙 등 R이 들어가면서 계산이 단순한 편인 공식들을 이용하거나 (3)적절한 기준을 잡아 simulated annealing 등의 수치적 접근을 하는 다양한 방법으로 문제를 해결할 수 있을 것이다.
아래는 제출한 소스코드이다.
#define PI 3.141592653589793
#include <iostream>
#include <cmath>
using namespace std;
typedef long double ld;
ld A[3][3], Bx[3][3], By[3][3], C[3][3];
ld X1, Y1, X2, Y2, X3, Y3;
ld det(ld (&arr)[3][3]) {
return arr[0][0] * arr[1][1] * arr[2][2] + arr[0][1] * arr[1][2] * arr[2][0] + arr[0][2] * arr[1][0] * arr[2][1] - arr[0][0] * arr[1][2] * arr[2][1] - arr[0][1] * arr[1][0] * arr[2][2] - arr[0][2] * arr[1][1] * arr[2][0];
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout << fixed;
cout.precision(2);
while (cin >> X1 >> Y1 >> X2 >> Y2 >> X3 >> Y3) {
A[0][0] = X1, A[0][1] = Y1, A[0][2] = 1;
A[1][0] = X2, A[1][1] = Y2, A[1][2] = 1;
A[2][0] = X3, A[2][1] = Y3, A[2][2] = 1;
Bx[0][0] = X1 * X1 + Y1 * Y1, Bx[0][1] = Y1, Bx[0][2] = 1;
Bx[1][0] = X2 * X2 + Y2 * Y2, Bx[1][1] = Y2, Bx[1][2] = 1;
Bx[2][0] = X3 * X3 + Y3 * Y3, Bx[2][1] = Y3, Bx[2][2] = 1;
By[0][0] = X1 * X1 + Y1 * Y1, By[0][1] = X1, By[0][2] = 1;
By[1][0] = X2 * X2 + Y2 * Y2, By[1][1] = X2, By[1][2] = 1;
By[2][0] = X3 * X3 + Y3 * Y3, By[2][1] = X3, By[2][2] = 1;
C[0][0] = X1 * X1 + Y1 * Y1, C[0][1] = X1, C[0][2] = Y1;
C[1][0] = X2 * X2 + Y2 * Y2, C[1][1] = X2, C[1][2] = Y2;
C[2][0] = X3 * X3 + Y3 * Y3, C[2][1] = X3, C[2][2] = Y3;
ld a = det(A), bx = -det(Bx), by = det(By), c = -det(C);
ld R = sqrt(bx * bx + by * by - 4 * a * c) / (2 * abs(a));
cout << 2 * PI * R << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 26944 // C++] Uppställning (0) | 2023.01.11 |
---|---|
[BOJ 26942 // C++] Gruppindelning (1) | 2023.01.11 |
[BOJ 25558 // C++] 내비게이션 (0) | 2023.01.10 |
[BOJ 18130 // C++] 여름나기 (0) | 2023.01.10 |
[BOJ 27110 // C++] 특식 배부 (0) | 2023.01.10 |