탱크에 물을 채우는 속도(rate), 탱크의 높이(height)와 반지름(radius)이 주어졌을 때, 주어진 시간 안에 탱크가 넘치는지(오버플로), 부족하게 차는지(언더플로), 아니면 딱 맞게 채워지는지 판별하는 C++ 프로그램을 살펴보겠습니다.
문제 예시
입력: radius = 2, height = 5, rate = 10
출력: tank overflow (탱크가 넘침)
입력: radius = 5, height = 10, rate = 10
출력: tank underflow (탱크가 부족함)
접근 방법
원기둥 모양의 탱크 부피는 V = π × r² × h 공식으로 구할 수 있으며, 여기서 π는 22/7로 근사합니다. 탱크를 가득 채우는 데 필요한 예상 시간은 부피를 채우는 속도로 나눈 값이며, 이 예상 시간과 기준 시간을 비교하면 결과를 판별할 수 있습니다.
- 채우는 속도(rate), 탱크의 높이와 반지름을 입력받습니다.
- 탱크의 부피를 계산해 물이 차는 예상 시간을 구합니다.
- 조건을 비교해 결과를 판정합니다.
- 예상 시간 < 기준 시간 → 탱크가 넘침 (overflow)
- 예상 시간 > 기준 시간 → 탱크가 부족함 (underflow)
- 예상 시간 = 기준 시간 → 정확히 채워짐 (filled)
- 결과를 출력합니다.
알고리즘
시작
1단계 -> 탱크의 부피를 계산하는 함수 선언
float volume(int rad, int height)
return ((22.0 / 7.0) * rad * rad * height)
2단계 -> 오버플로, 언더플로, 정상 충전 여부를 확인하는 함수 선언
void check(float expected, float original)
IF (expected < original)
"tank overflow" 출력
End
ELSE IF (expected > original)
"tank underflow" 출력
End
ELSE
"tank filled" 출력
End
3단계 -> int main()
int rad = 2, height = 5, rate = 10 으로 설정
float original = 70.0 으로 설정
float expected = volume(rad, height) / rate 로 계산
check(expected, original) 호출
종료
C++ 코드 구현
#include <bits/stdc++.h>
using namespace std;
// 탱크의 부피 계산
float volume(int rad, int height) {
return ((22.0 / 7.0) * rad * rad * height);
}
// 오버플로, 언더플로, 정상 충전 여부를 확인하는 함수
void check(float expected, float original) {
if (expected < original)
cout << "tank overflow";
else if (expected > original)
cout << "tank underflow";
else
cout << "tank filled";
}
int main() {
int rad = 2, height = 5, rate = 10;
float original = 70.0;
float expected = volume(rad, height) / rate;
check(expected, original);
return 0;
}
실행 결과
tank overflow
코드 설명 및 주의 사항
위 프로그램은 원기둥 부피 공식 V = πr²h를 이용해 탱크의 전체 용적을 구하고, 이를 채우는 속도(rate)로 나누어 탱크가 가득 차는 데 걸리는 예상 시간(expected)을 계산합니다. 그런 다음 이 값을 기준 시간(original)과 비교하여 세 가지 상태 중 하나를 출력합니다.
구현 시 두 가지를 특히 주의해야 합니다. 첫째, 원주율을 22/7로 표현하면 정수 나눗셈이 적용되어 3으로 계산되는 오류가 발생할 수 있으므로 22.0/7.0처럼 실수형으로 작성해야 합니다. 둘째, 부피 공식에는 반지름의 제곱(rad × rad)이 곱해져야 정확한 용적이 계산됩니다. 위 예제에서는 예상 시간이 기준 시간보다 짧으므로, 같은 속도로 물을 채우면 주어진 시간보다 일찍 가득 차게 되어 "tank overflow"가 출력됩니다.