티스토리 뷰

알고리즘/백준

백준 / 7869 두 원 C++

4567은 소수 2021. 2. 19. 05:13

www.acmicpc.net/problem/7869

 

7869번: 두 원

첫째 줄에 두 원의 중심과 반지름 x1, y1, r1, x2, y2, r2가 주어진다. 실수는 최대 소수점 둘째자리까지 주어진다.

www.acmicpc.net

역시 잠이 오면 머리가 안 돌아간다.

예제조차 안 맞길래 어디서 잘못되었나 보니 공식 유도를 잘못했었다. 

그 다음으로 0일 때 출력을 간과했었다. (0.000 으로 출력)

 

케이스를 나누어 (사실 원이 겹칠 경우만 잘 계산하면 됨) 공식 유도를 열심히 하면 된다. 

 

코드는 다음과 같다.

#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>

using namespace std;

double pi = 3.14159265358979323846;
double X1, Y1, R1, X2, Y2, R2, result, dist;

// 원 중심 거리 구하기
double cal_dist()
{
	double X = (X2 - X1) * (X2 - X1);
	double Y = (Y2 - Y1) * (Y2 - Y1);
	return sqrt(X + Y);
}

void init()
{
	scanf("%lf %lf %lf %lf %lf %lf", &X1, &Y1, &R1, &X2, &Y2, &R2);
	dist = cal_dist();
}

// 안 겹침
double calc1()
{
	result = 0;
	return result;
}

// 한 원이 한 원 내부
double calc2()
{
	if (R1 < R2)
		return R1 * R1 * pi;
	else
		return R2 * R2 * pi;
}

// 두 원이 겹침
double calc3()
{
	double theta1 = acos((R1 * R1 + dist * dist - R2 * R2) / (2 * R1 * dist));
	double theta2 = acos((R2 * R2 + dist * dist - R1 * R1) / (2 * R2 * dist));
	
	theta1 = theta1 * 2;
	theta2 = theta2 * 2;

	double S1 = (R1 * R1 * theta1 * 0.5) - (R1 * R1 * sin(theta1) * 0.5);
	double S2 = (R2 * R2 * theta2 * 0.5) - (R2 * R2 * sin(theta2) * 0.5);

	return S1 + S2;
}

// n번째 자리에서 반올림
double round(double num, int n)
{
	double t = pow(10, n - 1);
	return round(num * t) / t;
}

int main()
{
	init();
	if ((R1 + R2) < dist)
		printf("%.03f", result);
	else if (abs(R2 - R1) >= dist) {
		result = calc2();
		result = round(result, 4);
		printf("%.03f", result);
	}
	else {
		result = calc3();
		result = round(result, 4);
		printf("%.03f", result);
	}
}

 

'알고리즘 > 백준' 카테고리의 다른 글

백준 / 15685 드래곤 커브 C++  (0) 2021.02.22
백준 / 2589 보물섬 C++  (0) 2021.02.20
백준 / 20040 사이클 게임 C++  (0) 2021.02.19
백준 / 4803 트리 C++  (0) 2021.02.17
백준 11780 플로이드 2 C++  (0) 2021.02.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함