[프로그래머스-Level 1] [JavaScript] 콜라 문제 - 재귀 함수 활용

2022. 11. 23. 00:45알고리즘/프로그래머스 알고리즘 공부

반응형

[문제]

 

한 마트에서는 빈 병 a개를 가져다가 주면 콜라 b병을 줍니다. 이 때 빈 병 n개를 마트에 가져다주었을 때 콜라 몇 병을 받을 수 있는지 계산하세요. 빈 병이 a개 미만인 경우에 더 이상 콜라를 받을 수 없습니다. (예시: a가 3, b가 1, n이 20이라고 가정했을 때, 빈 병 3개를 가져다주면, 콜라 1병을 받습니다. 처음에는 빈 병 3개당 콜라 1개를 받을 수 있으므로 빈 병 18개를 가져다주면 콜라 6병을 받게 됩니다. 그리고 콜라 6병을 모두 마셨다고 가정합니다. 그러면 현재까지 남아 있는 콜라는 총 (2+6) = 8병이 되고 콜라 8병에서 이제 6병을 가져다주면 콜라 2병을 받게 됩니다. 이제 2+2 = 4병이 남게 되며 여기에서 3병을 가져다가 1병을 받으면 총 1+1 = 2병이 남게 됩니다. 3병당 1병을 새로 받으므로 더 이상 받을 수 없습니다. 결론적으로 받은 콜라의 병 개수는 6+2+1 = 9개입니다)

 

[알고리즘]

 

재귀 함수를 활용하여 콜라의 개수를 계산해가며 반복할 수 있습니다. 

 

[풀이]

 

재귀 함수는 항상 탈출 조건이 명시되어야 합니다. 그것이 바로 if (n < a)이며 else를 활용해서 그렇지 않은 경우 계속 값을 업데이트하여 재귀함수를 호출해주면 됩니다. 더 자세한 이해를 위해서 아래 주석 설명을 참고하시기 바랍니다. Math.floor 함수를 통해서 내림 즉 20 / 6 = 3.333..을 3으로 만들어주는 역할을 합니다. 아래 n % a + sum에서 %(modulo)는 나머지를 구할 때 쓰는 연산자이며 20 % 3은 2가 됩니다.

 

function solution(a, b, n) {
    // 현재 남아 있는 콜라의 병 개수가 a보다 작은 경우
    if (n < a) {
    	// a가 더 큰 경우, 0이 최종적으로 합산되어 결과가 나오게 됩니다.
        return 0;
    } 
    else {
    	// 빈 병을 가져다주고 받는 콜라의 병 개수를 계산합니다.
        let sum = Math.floor(n / a) * b;
        
        /* 
        계산한 콜라의 개수를 재귀 함수를 통해 계속 누적해서 더해줍니다.
        solution(a, b, n)에서 n의 자리에 n을 a로 나눈 나머지와 위에서 계산한 sum을 합산하여
        파라미터로 전달해줍니다.
        */
        return sum + solution(a, b, n % a + sum);
    }
}

 

반응형