세 개의 정수 a, b, c가 주어졌다고 가정해 봅시다. 각각 a개, b개, c개의 돌이 들어 있는 세 개의 돌 더미가 있으며, 우리는 다음 두 가지 연산을 반복해서 수행할 수 있습니다.
- 첫 번째 더미에서 돌 1개, 두 번째 더미에서 돌 2개를 가져옵니다. (단, 각 더미에 필요한 만큼의 돌이 남아 있어야 합니다)
- 두 번째 더미에서 돌 1개, 세 번째 더미에서 돌 2개를 가져옵니다. (단, 각 더미에 필요한 만큼의 돌이 남아 있어야 합니다)
이때, 위 연산들을 통해 수집할 수 있는 돌의 최대 개수를 구해야 합니다.
예를 들어 입력이 a = 3, b = 4, c = 5라면 출력은 9가 됩니다. 먼저 두 번째 더미와 세 번째 더미에서 연산을 두 번 수행하여 두 번째 더미에서 2개, 세 번째 더미에서 4개, 총 6개의 돌을 얻을 수 있습니다. 이후 첫 번째 더미에서 1개, 두 번째 더미에서 2개를 추가로 가져와 3개를 더하면 총 9개가 됩니다.
풀이 접근 방식
이 문제를 해결하기 위해 다음 단계를 따릅니다.
- 먼저 세 번째 더미의 돌을 최대한 활용합니다. 한 번의 연산으로 두 번째 더미에서 1개, 세 번째 더미에서 2개를 가져오므로, 이 연산은 min(b, c / 2)번 수행할 수 있습니다.
- 그다음 남은 두 번째 더미의 돌과 첫 번째 더미를 활용합니다. 남은 돌은 b - min(b, c / 2)개이며, 이 연산은 min(a, (b - min(b, c / 2)) / 2)번 수행할 수 있습니다.
- 각 연산마다 돌 3개씩(1 + 2) 수집되므로, 총 수집 개수는 두 연산 횟수의 합에 3을 곱한 값입니다.
이를 수식으로 표현하면 다음과 같습니다.
return (min(b, c / 2) + min(a, (b - min(b, c / 2)) / 2)) * 3
구현 예제
아래 구현 예제를 통해 더 잘 이해해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
int solve(int a, int b, int c){
return (min(b, c / 2) + min(a, (b - min(b, c / 2)) / 2)) * 3;
}
int main(){
int a = 3;
int b = 4;
int c = 5;
cout << solve(a, b, c) << endl;
}입력
3, 4, 5
출력
9