알고리즘/codewars

codewars: Tank Truck

꾸준함. 2018. 1. 30. 20:37

문제 링크입니다: 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


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형