문제 링크입니다: https://www.codewars.com/kata/tank-truck/train/cpp
수학을 오랜만에 하려니 정말 막막했습니다.
인터넷으로 공식을 모두 검색한 결과 풀 수 있었습니다!
아래 그림은 부연설명용으로 편집한 그림입니다.
/*
이웃집에 탱크 트럭을 모는 아저씨가 산다.
기름이 어느정도 남았는지 표시하는 등이 나가버려서 이웃집
아저씨는 남은 기름으로 배달이 가능한지 판별을 할 수 없는 상태이다.
그래서 트럭을 평평한 땅 위에 둔 다음에 탱크의 연료의 높이를 측정하였다.
운이 좋게도 탱크의 연료통은 완벽한 원기둥이다.
남은 연료의 높이는 h, 지름은 d, 그리고 총 부피는 vt이다.
남은 연료의 부피를 구하시오
*/
#include <iostream>
#include <cmath>
using namespace std;
const float PI=3.14;
class VolTank
{
public:
static int tankVol(int h, int d, int vt);
};
int VolTank::tankVol(int h, int d, int vt)
{
float radius = d / 2.0f; //반지름
float height = radius - h; //반지름에서 남은 기름 높이 뺸 값
float theta = acos(height / radius); //내각의 반(그림으로 설명)
float halfWidth = radius*sin(theta); //삼각형 밑변의 반
float cylinderHeight = vt / (PI * radius*radius); //원기둥 높이
float sectorArea = (radius*radius*theta) / 2.0f; //부채꼴 넓이
float triangleArea = (halfWidth*height) / 2.0f; //삼각형 넓이
float remainderArea = (sectorArea - triangleArea) * 2.0f; //남은 부분 넓이(반만 구했으므로 두배를 해줘야한다)
return cylinderHeight*remainderArea; //남은 부분 * 높이
}
int main(void)
{
cout << VolTank::tankVol(5, 7, 3848) << endl;
cout << VolTank::tankVol(2, 7, 3848) << endl;
cout << VolTank::tankVol(2, 8, 5026) << endl;
cout << VolTank::tankVol(4, 9, 6361) << endl;
cout << VolTank::tankVol(40, 120, 3500) << endl;
cout << VolTank::tankVol(60, 120, 3500) << endl;
cout << VolTank::tankVol(80, 120, 3500) << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > codewars' 카테고리의 다른 글
codewars Validate Credit Card Number (0) | 2018.02.01 |
---|---|
codewars: Playing on a chessboard (0) | 2018.02.01 |
codewars: Statistics for an Athletic Association (0) | 2018.01.30 |
codewars: Simple Encryption #1 - Alternating Split (0) | 2018.01.30 |
codewars: Build a pile of Cubes (0) | 2018.01.29 |