예시
콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다.
빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?
단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.해당 문제를 일반화하여
콜라를 받기 위해 마트에 주어야 하는 병 수a,
빈 병a개를 가져다 주면 마트가 주는 콜라 병 수b,
가지고 있는 빈 병의 개수n이 매개변수로 주어집니다.
받을 수 있는 콜라의 병 수를 return 하도록solution함수를 작성해주세요.
public class ColaProblem
{
/// <summary>
///
/// </summary>
/// <param name="a">콜라를 받기 위해 마트에 주어야 하는 병 수</param>
/// <param name="b">빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수</param>
/// <param name="n">가지고 있는 빈 병의 개수</param>
/// <returns></returns>
public int Solution(int a, int b, int n)
{
int answer = 0;
ExchangeWithCola(a, b, n, ref answer);
return answer;
}
/// <summary>
/// 정해진 규칙 내에서 콜라를 교환하는 기능을 실행
/// </summary>
/// <param name="a">콜라를 받기 위해 마트에 주어야 하는 병 수</param>
/// <param name="b">빈 병 a개를 가져다 주면 마트가 주는 콜라 병 수</param>
/// <param name="n">가지고 있는 빈 병의 개수</param>
/// <param name="answer">최종적으로 누적된 병의 개수</param>
private void ExchangeWithCola(int a, int b, int n, ref int answer)
{
if (n < a)
{
//Console.WriteLine("left : " + n);
return;
}
int exchangedCola = n / a * b;
int remainBottle = n / a * b + n % a;
//정답에는 교환 받은 콜라의 개수의 합을 도출해야 하므로
//Console.WriteLine("Add Cola : " + exchangedCola);
answer += exchangedCola;
//다음 교환을 위한 빈 병의 개수에는 남은 콜라의 개수도 고려
n = remainBottle;
ExchangeWithCola(a, b, n, ref answer);
}
}
answer 값을 참조로 전달받아 해당 값에 도출해야하는 누적된 교환 받은 콜라의 개수를 저장하도록 함 private void ExchangeWithCola(int a, int b, int n, ref int answer)
{
if (n < a)
{
return;
}
int exchangedCola = n / a * b;
int remainBottle = n / a * b + n % a;
//정답에는 교환 받은 콜라의 개수의 합을 도출해야 하므로
answer += exchangedCola;
//다음 교환을 위한 빈 병의 개수에는 남은 콜라의 개수도 고려
n = remainBottle;
ExchangeWithCola(a, b, n, ref answer);
}
n이 기준이 되는 a보다 작다면 해당 재귀 함수를 벗어나도록 조건을 설정n을 a로 나눈 몫에 b를 곱한 값이므로 해당 값을 구해 answer에 더함n을 갱신ExchangeWithCola 함수를 실행