Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

세 개의 돌 더미에서 수집할 수 있는 최대 돌 개수를 구하는 C++ 코드

세 개의 정수 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. 먼저 세 번째 더미의 돌을 최대한 활용합니다. 한 번의 연산으로 두 번째 더미에서 1개, 세 번째 더미에서 2개를 가져오므로, 이 연산은 min(b, c / 2)번 수행할 수 있습니다.
  2. 그다음 남은 두 번째 더미의 돌과 첫 번째 더미를 활용합니다. 남은 돌은 b - min(b, c / 2)개이며, 이 연산은 min(a, (b - min(b, c / 2)) / 2)번 수행할 수 있습니다.
  3. 각 연산마다 돌 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