[Day 5] BOJ 7549 : Yeehaa!

khj20006·2022년 11월 4일
post-thumbnail

문제

오늘도 역시 원을 계속 그려나가는 문제를 들고왔습니다.
문제가 영어로 써있지만 전혀 중요하지 않습니다.
구글 번역기의 힘을 잠깐 빌려볼까요?

짜잔! 자 이제 문제를 풀어봅시다.

해결 전략

서로 붙어있는 작은 원을 2개만 골라볼까요?

큰 원의 중심과 작은 원의 중심으로 이루어진 삼각형을 생각해봅시다.
길이가 Rr,Rr,2rR-r, R-r, 2r로 이루어진 이등변 삼각형이 만들어집니다.

큰 원의 중심을 OO, 작은 원의 중심을 각각 A,BA, B라고 하겠습니다.

AOB=2πn\angle AOB = \frac{2\pi}{n}이고, 점 OO에서 AB\overline{AB}로 수선의 발을 긋고 이 점을 HH라고 하면,
AOH=πn\angle AOH = \frac{\pi}{n}입니다.

삼각함수를 이용하면, sin(πn)=rRrsin(\dfrac{\pi}{n}) = \dfrac{r}{R-r}이고,
식을 rr에 대해 정리하면 r=Rsin(πn)1+sin(πn)r = \dfrac{Rsin(\frac{\pi}{n})}{1+sin(\frac{\pi}{n})}입니다.

코드

#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
using namespace std;

int main() {
	cin.tie(0)->sync_with_stdio(0);
	int N, n;
	cin >> N;
	cout.setf(ios::fixed);
	cout.precision(3);
	for (int i = 1; i <= N; i++) {
		cout << "Scenario #" << i << ":\n";
		double R;
		cin >> R >> n;
		cout << R * sin(M_PI / n) / (1 + sin(M_PI / n)) << "\n\n";
	}
	cout.unsetf(ios::fixed);
}

회고

문제를 꾸준히 풀다보니 점점 성취감과 뿌듯함이 느껴지네요! 앞으로 더 열심히 풀어야겠어요

profile
PS 및 알고리즘 공부, 개발 등 잡다한 코딩 관련 블로그

0개의 댓글