[C#] 콜라 문제

Connected Brain·2025년 7월 4일

코딩 테스트

목록 보기
20/67

콜라 문제

문제 설명

예시

콜라 빈 병 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보다 작다면 해당 재귀 함수를 벗어나도록 조건을 설정
  • 교환받은 콜라의 수는 na로 나눈 몫에 b를 곱한 값이므로 해당 값을 구해 answer에 더함
  • 이후 교환을 위한 빈 병의 개수에는 교환받은 콜라의 개수 뿐만 아니라 교환에 사용하지 않은 나머지도 누적해서 사용하므로 나머지도 더해 n을 갱신
  • 갱신된 값에 따라 다시 ExchangeWithCola 함수를 실행

0개의 댓글