20151023


*이 문제는 삼각함수 호도법을 알고 있어야 합니다.
*이문제는 dovelet 에 있는 알고리즘 문제입니다.



정다각형 면적/rpoly 




프로그램 명: rpoly(open)

제한시간: 1 초    

그림과 같이 원안에 있는 정 다각형에서

원의 반지름 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] 사이에서 정의됩니다.

1
 

2)매크로 이용하기

1
2
3
4
5
6
7
#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.
1
2
3
4
5
6
7
#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 으로 변경해서 프로그램을 해야 합니다.


 


+ Recent posts