20151023
*이 문제는 삼각함수 호도법을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.
정다각형 면적/rpoly
프로그램 명: rpoly(open)
그림과 같이 원안에 있는 정 다각형에서
원의 반지름 r 과 n 각형의 정보가 주어질 때 이 정 다각형의 면적을 구하는 것이다.
입력
실수 r 과 정수 n 이 주어진다. (0 < r < 20000 , 2 < n < 20000)
출력
다각형의 면적을 소수 이하 세자리까지 구한다.
입출력 예
입력
2 2000
출력
12.566
입력
10 3000
출력
314.159
출처: Brightness of Brain Contest
Suman Mahbub
Created: 12-09-2002
Updated: 14-12-2002
Idea: mAruf Hasan
문제 풀이
1) 풀이
import java.io.PrintStream; import java.util.Scanner; public class Main { Scanner sc = new Scanner(System.in); static PrintStream p = System.out; float r, n; public static void main(String[] args) { Main m = new Main(); m.input(); m.polygonsOutput(); } void input(){ r = sc.nextFloat(); n = sc.nextFloat(); } void polygonsOutput(){ double temp = 0.5*r*r*Math.sin(2*Math.PI/n)*n; p.printf("%.3f", temp); } }
*짧게 코딩하는것도 좋지만 저는 함수와 객체 지향개념을 쓰고 싶어서 이렇게 코딩 했습니다.
개인적으로 정말 오래 걸렸던 문제 입니다. 호도법 , 삼각함수 개념을 알고 있어야 하는 문제인데..
둘다 기억이 안났습니다... 덕분에 유튜브로 ebs 강의로 호도법 , 삼각함수를 배우기도 했고 오래걸린
만큼 뿌듯 하네요.
여기서 호도법 , 삼각함수를 간단한 설명은 아래에 소개되어 있습니다.
개념을 안다면
다각형을 삼각형으로 쪼개고 그 삼각형 넓이를 구하는 식은
S = 1/2 *r *r * sin(360/n)
입니다.
여기에 n 개를 곱하고 소수점 3자리 수까지 출력하면 됩니다.
힌트 개념
1. 파이 표현
1)삼각 함수 이용하기
그림은 cos 함수 그래프 입니다.
cos pi = -1 이니 cos 함수의 역함수 acos 함수를 이용하여 pi 값을 구할 수 있습니다.
역 함수가 정의되기 위해서는 꺽이는 영역이 없는 증가 구간이나 감소구간에서 정의되므로 cos 의 역함수는 [0,pi] 사이에서 정의됩니다.
12)매크로 이용하기
1234567#include <stdio.h>
#include <math.h>
int
main()
{
printf
(
"%lf"
,M_PI);
}
2.호도법 이해하기
정수로 모든 실수를 표현 못하는 것과 마찬 가지로 도,분,... 등으로 모든 각을 표현할 수는 없습니다. 그래서 나오는 개념이 길이로 각을 표현하자는 것이 호도법입니다.호도법이란 각의 크기를 단위원(반지름이 1 인 원)의 호의 길이로 나타내는 방법 입니다.
30 도를 호도법으로 나타내면 어떻게 될까요?
30 도일 때 호의 길이가 호도 이므로 2*π*30/360 ..π/6 이 됩니다. 길이 단위이지만 각을 나타낸다 라는 것을 표시하기 하기위해 라디언(radian) 이라 붙여 줍니다. 단위는 아니고 길이인데 각을 나타낸다 정도로 이해하면 됩니다.
180 도는 반원의 호의 길이이므로 π 라디언이 됩니다. 즉 1 도는 π/180 이므로 도를 라디언으로 바꾸기 위해서 π/180 을 곱하면 됩니다.
#include <math.h> double sin(double x); float sinf(float x); long double sinl(long double x); DESCRIPTION The sin() function returns the sine of x, where x is given in radians.
1234567#include <stdio.h>
#include <math.h>
int
main()
{
printf
(
"%lf"
,
sin
(30.0*M_PI/180));
// sin 30 도 구하기
}
3. 넓이 구하기
내접하는 정 n 각형의 한 삼각형의 중심각의 크기는 360/n 도 입니다.두 변이 주어지고 끼인각을 안다면 삼각형의 면적을 구할 수 있고 , 이 경우 두 변의 길이가 r 이고 끼인 각이 360/n 도 입니다.
하나의 삼각형의 넓이는 S = 1/2 *r *r * sin(360/n) 이고 이 것이 n 개 있으므로 n 을 곱하면 됩니다. 물론 radian 으로 변경해서 프로그램을 해야 합니다.
'알고리즘(dovelet 문제풀이) > 1층' 카테고리의 다른 글
선의 수 구하기/complete_graph(선의 수 구하기 알고리즘) (0) | 2015.10.24 |
---|---|
X 길이 구하기/x_length(X 길이 구하기 알고리즘) (0) | 2015.10.24 |
spot of light/spot(spot of light 알고리즘) (0) | 2015.10.23 |
angle/open(angle 알고리즘) (0) | 2015.10.22 |
maxandmin/maxandmin(maxandmin 알고리즘) (0) | 2015.10.22 |