간단한 문제 요약
치킨은 양념 치킨, 후라이드 치킨, 반반 치킨 세 종류를 판매한다. 각각 A원, B원, C원이다. 파티를 위해 양념취킨 최소 X마리, 후라이드 치킨 최소 Y마리 구매해야한다. 반반 치킨 두마리를 구입하면 양념치킨 하나, 후라이드 치킨 하나를 만들 수 있다. 치킨을 구매하는 금액의 최소값을 구하자.
고려해야 할 사항
- 최소한으로 양념 X마리, 후라이드 Y마리를 구매해야 한다.
- X, Y를 구매할 수 있는 최소 가격을 찾어야한다.
문제 풀이, 했갈렸던 점
대박..
접근 방법은 크게 두가지 였습니다.
첫째는 후라이드 X마리 + 양념 Y마리 구매하는 경우
두번째는 최소 X, Y중 작은 값 만큼 반반 * 2로 구매한 가격 + 남은 치킨 * 해당 치킨 가격 만큼 구매한 가격
이 두가지 중 비교를 했습니다.
이렇게 생각한 이유는 반반으로 구매하는 경우 X, Y 중 최소값 * 2만큼만 구매하고 나머지는 abs(x-y) * 특정 치킨 가격으로 구매하는 경우가 최소한의 가격으로 최선의 치킨을 구매할 수 있다는 생각이 들었기 때문입니다..
최소 X, 최소 Y마리를 구매하는 최소값을 요구하는 문제입니다. 최소한을 넘어서 후라이드나 양념을 구매해도 최소값이 될 수 있습니다.
그 에를들어
1500 2000 500 90 100
이 경우입니다.
1500*90 + 2000 * 100보다 90 * 500 * 2로 구매하는 경우가 후라이드 90, 양념 90마리를 구매하는데 더 값이 쌉니다.
마지막 으로 양념을 10마리 더 구매해야 합니다.
2000 * 10보다, 반반 가격*2*10마리로 후라이드 10마리 더 구매하지만, 더 싼 가격으로 구매할 수 있다는 사실입니다.
무조건 최소한으로만 구매해야 이득이라는 생각에 사로잡혔지만 위 예외 경우를 생각하게 되었습니다.
코드
let input = readLine()!.split{$0==" "}.map { Int(String($0))! }
let (a,b,c,d,e) = (input[0],input[1],input[2],input[3],input[4])
let shared = min(d,e), last = abs(d-e)
var res = c*shared*2
res += min(d>e ? a*last : b*last, c*last*2)
print(min(res, a*d + b*e))