본문 바로가기

알고리즘/백준

백준 2896번 - 무알콜 칵테일 C++

SMALL

2896번: 무알콜 칵테일 (acmicpc.net)

 

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