※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 6600번 문제인 원의 둘레이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/6600 

 

6600번: 원의 둘레

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 실수 x1, y1, x2, y2, x3, y3이 주어진다. 세 점으로 만들 수 있는 원의 지름은 백만을 넘지 않는다.

www.acmicpc.net

좌표평면 위의 세 점이 주어졌을 때의 외접원의 반지름을 구하는 공식은 이곳(링크)에서 찾아볼 수 있다. 위 식을 이용해 원의 둘레를 계산하는 것으로 문제를 해결할 수 있다.

 

위와 같은 공식을 사용하지 않더라도 (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

+ Recent posts