원기둥 모양 물탱크의 반지름과 높이, 탱크에 담그려는 'n'개의 구형 고체 공의 반지름, 그리고 탱크에 현재 담겨 있는 물의 부피가 주어졌을 때, 공들을 물탱크에 담그면 탱크가 넘치는지 아닌지를 확인하는 것이 이 글의 목표입니다.
부피 계산 공식
원기둥(물탱크)
3.14 * r * r * h
여기서 r은 탱크의 반지름, h는 탱크의 높이입니다.
구(공)
(4/3) * 3.14 * R * R * R
여기서 R은 구형 공의 반지름입니다.
입력 및 출력 예시
입력
tank_height = 5 tank_radius = 2 water_volume = 10 capacity = 10 ball_radius = 2
출력
it will overflow
문제 해결 접근 방식
- 탱크의 반지름과 높이, 담글 공의 개수와 반지름 등 주어진 치수들을 입력받습니다.
- 공식을 적용하여 탱크의 용량(부피)을 계산합니다.
- 공식을 적용하여 구 하나의 부피를 계산합니다.
- 공이 물탱크에 담길 때마다 물의 부피가 증가하므로, 현재 물의 부피를 계산합니다.
- 물의 부피와 공들의 부피를 더하여 총 부피를 구합니다.
- 총 부피와 탱크 용량을 비교하여 넘침 여부를 판단합니다.
- 총 부피가 용량보다 크면 → 탱크가 넘칩니다.
- 총 부피가 용량보다 작으면 → 탱크가 넘치지 않습니다.
알고리즘
Step 1 → 탱크가 넘치는지 확인하는 함수 선언
void overflow(int H, int r, int h, int N, int R)
float tank_cap = 3.14 * r * r * H 선언
float water_vol = 3.14 * r * r * h 선언
float balls_vol = N * (4 / 3) * 3.14 * R * R * R 선언
float vol = water_vol + balls_vol 선언
IF (vol > tank_cap)
"it will overflow" 출력
End
Else
"No it will not overflow" 출력
End
Step 2 → main() 함수에서
int tank_height = 5, tank_radius = 2, water_volume = 10,
capacity = 10, ball_radius = 2 선언
overflow(tank_height, tank_radius, water_volume, capacity, ball_radius) 호출C++ 예제 코드
#include <bits/stdc++.h>
using namespace std;
// 탱크가 넘치는지 확인하는 함수
void overflow(int H, int r, int h, int N, int R){
float tank_cap = 3.14 * r * r * H;
float water_vol = 3.14 * r * r * h;
float balls_vol = N * (4 / 3) * 3.14 * R * R * R;
float vol = water_vol + balls_vol;
if (vol > tank_cap){
cout<<"it will overflow";
}
else{
cout<<"No it will not overflow";
}
}
int main(){
int tank_height = 5, tank_radius = 2, water_volume = 10, capacity = 10, ball_radius = 2;
overflow(tank_height, tank_radius, water_volume, capacity, ball_radius);
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
it will overflow
참고: 정수 나눗셈 주의점
위 코드에서 (4 / 3)은 정수끼리의 나눗셈이므로 소수점 이하가 버려져 결과가 1이 됩니다. 따라서 구의 부피가 실제보다 작게 계산될 수 있습니다. 정확한 결과를 얻으려면 N * (4.0 / 3.0) * 3.14 * R * R * R처럼 실수형 나눗셈으로 수정하는 것이 좋습니다.