16917번: 양념 반 후라이드 반
Memo
로직 설명
- 반반 치킨으로 구매하지 않는 경우부터 시작하여, 반반 치킨을 하나 씩 증가시켜 구매 금액의 최소값을 구하는 방법으로 구현했습니다.
자료 구조
PASS
코드 설명
long long loop = std::max(X, Y) * 2;
while (c_num <= loop)
{
tmp = X * A + Y * B + c_num * C;
if (ans > tmp)
ans = tmp;
if (X > 0)
X--;
if (Y > 0)
Y--;
c_num += 2;
}
- 반반 치킨의 갯수는 max(X, Y) * 2; 보다 커지면 그 이전에 계산한 비용의 최소값 보다 무조건 크기 때문에 조건으로 정했습니다.
- X, Y는 0이 되면 안되므로 분기 처리를 해주었습니다.
- 양념 치킨 1마리 + 후라이드 치킨 1마리 = 반반 치킨 * 2 이므로 c_num += 2
어려웠던 부분 😭
void solve()
{
if (2 * C > A + B)
std::cout << A * X + B * Y;
else
{
int _min = std::min(X, Y);
std::cout << 2 * C * _min + (X - _min) * A + (Y - _min) * B;
}
}
- 처음 생각했던 것은, 2 * C가 A + B 보다 크면 A * X + B * Y 가 정답이고, 그것이 아니라면 X와 Y의 작은 값을 이용하여 정답을 고르면 된다 생각했습니다.
- 위 코드의 문제점은, X와 Y의 값이 다르지만 오로지 반반 치킨을 사는 경우가 정답일 경우가 있는데 위 코드는 그 경우에 대한 정답을 구할 수 없습니다.
- 다른 예외가 있을 수도 있다는 생각에, 새로운 논리(아래 코드)를 적용했습니다.