2896번: 무알콜 칵테일
첫째 줄에 구매한 오렌지, 사과, 파인애플 주스의 양 A, B, C가 주어진다. (1 ≤ A, B, C ≤ 500) 둘째 줄에 칵테일을 만드는데 필요한 각 주스의 비율 I, J, K가 주어진다. (1 ≤ I, J, K ≤ 50)
www.acmicpc.net
요즘 회사일이 너무 바빠 알고리즘 문제를 풀 시간도... 블로그에 개발적인 이야기를 쓸 시간도 없었다. 하지만 그런 핑계를 가지고 글을 계속 안쓰면 내가 시작한 이유가 없어질 것 같아 간단한 문제라도 풀고 올리자라는 취지에서 무알콜 칵테일 문제를 풀게되었다.
무알콜 칵테일 문제는 단순 수학문제이다. 즉 간단한 사고력만 가지고 풀 수 있는 문제이며, 복잡한 알고리즘은 필요하지 않다. 아래에서 빨간색 줄로 표기한 부분만 생각하면 간단하게 풀 수 있다. 주의해야 할 점은 정답과의 오차는 10^-4까지 허용한이다. 여기서 std::setprecision을 사용하여야 한다는 것을 인지하면 된다. std::setprecision에 관한 포스팅은 내일 꼭 올리도록 하겠다.
빨간색 밑줄의 내용을 생각해보면 최대한 많이 만들었을 때이다. 그러면 오렌지, 사과, 파인애플의 양 A, B, C와 필요한 비율 I, J, K 중 A/I or B/J or C/K 중 가장 작은 값을 사용하면 된다. 가장 큰 값을 사용하거나 중간 값을 사용하면 안되는 이유는 간단하다. 가장 큰 값을 쓸 경우 1:1:1 비율이 아닌 경우에는 칵테일을 만들지 못한다. 그렇기 때문에 최대한 많이라는 문구에서 가장 큰 값이라고 생각할 수 있지만 역으로 가장 작은 값이라는 것만 생각하면 된다.
이렇게 문제를 이해하고 아래 코드를 참고하면 될 것 같다.
#include <iostream>
double A = 0.0, B = 0.0, C = 0.0;
double I = 0.0, J = 0.0, K = 0.0;
/************************************************
@함수명 : Input
@기능 : 입력받는 함수
@입력값 :
@출력값 :
@비고 :
*************************************************/
void Input()
{
std::cin >> A >> B >> C;
std::cin >> I >> J >> K;
}
/************************************************
@함수명 : GetMinDevideValue
@기능 : 음료수와 비율을 가지고 나누었을 때 가장 작은 값을 반환하는 함수
@입력값 :
@출력값 : 가장 작은 몫
@비고 :
*************************************************/
double GetMinDevideValue()
{
double dMinDevideVal = 0.0;
double dADevideVal = A / I;
double dBDevideVal = B / J;
double dCDevideVal = C / K;
if (dADevideVal > dBDevideVal)
{
dMinDevideVal = dBDevideVal;
}
else
{
dMinDevideVal = dADevideVal;
}
if (dMinDevideVal > dCDevideVal)
{
dMinDevideVal = dCDevideVal;
}
return dMinDevideVal;
}
/************************************************
@함수명 : PrintResult
@기능 : 정답을 출력하는 함수
@입력값 : 음료수를 나눌 몫
@출력값 :
@비고 :
*************************************************/
void PrintResult(const double &rDevideVal)
{
std::cout << std::fixed;
std::cout.precision(6);
std::cout << (A - (rDevideVal * I)) << ' ' << (B - (rDevideVal * J)) << ' ' << (C - (rDevideVal * K));
}
int main()
{
Input();
double dMinDevideVal = GetMinDevideValue();
PrintResult(dMinDevideVal);
return 0;
}
제출 결과
'알고리즘 > 백준' 카테고리의 다른 글
백준 2798번 - 블랙 C++ (0) | 2023.12.07 |
---|---|
백준 2146번 - 다리 만들기 C++ (2) | 2023.12.05 |