Practice for coding test

프로그래머스 - Level 1. 콜라 문제 / JavaScript (js)

Gray Park 2023. 2. 14. 11:30
728x90
반응형

문제설명

문제분석

이 문제는 옛날 콜라 문제의 2, 1 자리에 a, b를 넣으면 해결되는 문제입니다.

  • 현재 가지고 있는 빈 병 중 a개 묶음이 몇 개 나오는지 구합니다.
  • 이 묶음의 수와 묶음에 포함되지 못한 낱병의 합으로 다시 한 번 a개 묶음이 몇 개 나오는지 구합니다.
  • 동일한 과정을 빈 병의 총 갯수가 한 묶음에 묶여야하는 a개 미만인 경우까지 반복합니다.

문제를 단순화 했으니 이해하기 쉽게 코드를 짜보겠습니다.

이해하기 쉽게 코드작성하기

function solution(a, b, n) {
    return recursion(a, b, n);
}

function recursion(a, b, emptyBottles) {
	// 빈 병의 갯수가 한 묶음의 기준인 a개보다 적은 경우 0을 리턴
    if(emptyBottles < a) return 0;
    // 얻을 수 있는 새로운 병은 (빈 병 갯수 / a) * b개
    const newBottles = Math.floor(emptyBottles / a) * b;
    // (새로운 병 + 계산에서 제외된 낱병)으로 재귀적 반복
    return newBottles + recursion(a, b, newBottles + (emptyBottles % a));
}

위 코드는 어차피 한 함수에서 사용할 수 있으니, 합쳐줄 수 있습니다.

// solution 함수 내에 클로저 형태로 재귀적 호출을 하는 경우
function solution(a, b, n) {
    return (function recursion(emptyBottles) {
        if(emptyBottles < a) return 0;
        const newBottles = Math.floor(emptyBottles / a) * b;
        return newBottles + recursion(newBottles + (emptyBottles % a));
    })(n);
}

// solution 함수 자체를 재귀호출 하는 경우
function solution(a, b, n) {
    if(n < a) return 0;
    const newBottles = Math.floor(n / a) * b;
    return newBottles + solution(a, b, newBottles + (n % a));
}

재귀적으로 돌아가면 코드가 깔끔하지만, 언제 있을지 모를 스택오버플로우를 경계하며 반복문으로도 작성합니다.

function solution(a, b, n) {
    let answer = 0;
    while(n >= a) {
        const newBottles = Math.floor(n / a) * b;
        answer += newBottles;
        n = newBottles + (n % a);
    }
    return answer;
}

스택오버플로우이야기가 나와서 말인데, 각종 코딩 질문이 올라오는 스택오버플로우 사이트에는 여러 명언이 존재합니다. 그중에서도 오늘의 내용과 알맞은 명언이 하나 떠오르네요.

반복문은 프로그램의 성능을 좋게하고,
재귀문은 프로그래머의 성능을 좋게한다.

완전히 일치하는 말은 아니지만, 코드가 어떻게 동작할지 고민하는 과정 자체가 프로그래머의 능력을 향상시키는 데 도움이 된다는 점은 공감합니다.

728x90
반응형