[js] 치킨 쿠폰

sookyoung.k·2024년 7월 10일
1
post-thumbnail

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • chicken은 정수입니다.
  • 0 ≤ chicken ≤ 1,000,000

나의 풀이

function solution(chicken) {
    const aux = (coupons) => {
        // 10장 미만일 경우 치킨 x 
        if(coupons < 10) return 0;
        
        // 서비스 치킨 구하기 
        let serviceChicken = Math.floor(coupons / 10);
        // 남은 쿠폰
        const remainCoupon = coupons % 10;

        // 서비스 치킨에도 쿠폰이 발급되기 때문에 재귀 함수 사용
        return serviceChicken + aux(serviceChicken + remainCoupon);
    }
    
    return aux(chicken);
}

오 이건 보자마자 Y 언니가 요새 자주 사용하는 재귀함수를 통해서 풀어야겠다 생각을 했다.

➡️ 재귀적으로 서비스 치킨을 계산하는 함수를 만들었다.
1. if(coupons < 10) return 0; : 기본 조건, 쿠폰이 10장 미만일 경우 더이상 서비스 치킨을 받을 수 없다. 그러므로 0을 반환한다.

  1. let serviceChicken = Math.floor(coupons / 10); : 서비스 치킨을 계산한다. 현재 쿠폰 수를 10으로 나눈 몫을 구해 치킨의 수를 계산한다.

  2. const remainCoupon = coupons % 10; : 남은 쿠폰을 계산한다. 현재 쿠폰 수를 10으로 나눈 나머지를 구해 남은 쿠폰 수를 계산한다.

  3. return serviceChicken + aux(serviceChicken + remainCoupon); : 재귀 호출
    ➡️ 서비스 치킨을 받으면 새로운 쿠폰이 발급된다. 그러므로 서비스 치킨 수와 남은 쿠폰 수를 더해서 다시 aux 함수를 호출한다.
    ➡️ 현재 계산된 서비스 치킨 수에 재귀 호출 결과를 더해서 반환한다.

다른 풀이 1

function solution(chicken) {
    var answer = parseInt((chicken-1) / 9);
    return answer;
}

... 이게 이렇게 된다고? 수학 공부를... 해야 할까...

그냥 단순하게... parseInt((chicken-1) / 9)를 계산해서 반환한당... 이게 주어진 치킨 수로 받을 수 있는 서비스 치킨의 수를 구해준다.

어떻게...?

  • 서비스 치킨을 받기 위해서는 10장의 쿠폰이 필요하다.
  • 처음부터 쿠폰을 10장 모으는 과정에서 1장이 부족한 상태를 가정하고 계산을 간단하게 하려는 의도이다.
  • chicken-1을 해줌으로써 10장을 모으기 위한 기준을 9장으로 맞춘다.
  • 이렇게 하면 (chicken-1) / 9는 주어진 치킨 수에서 10장 단위로 받을 수 있는 서비스 치킨의 수를 계산한다.

와...
스터디 멤버 중에서 이렇게 푼 사람 있을까 ? ㅎㅎ
암튼 수학적 사고를 통해서 이렇게 간단하게 푼 사람도 발견했다.

다른 풀이 2

function solution(chicken) {
    let answer = 0;
    let coupon = chicken

    while(coupon >= 10){
        answer = answer + parseInt(coupon/10)
        coupon = parseInt(coupon/10)+ coupon%10
    }

    return answer;
}
  1. answer를 선언하고 0으로 초기화한다. 서비스 치킨의 총 개수를 저장한다.
  2. coupon을 선언하고 주어진 치킨 수로 초기화한다. 현재 가지고 있는 쿠폰의 수를 저장한다.
  3. while문을 돈다. coupon이 10장 이상일 때 반복한다.
    • answer = answer + parseInt(coupon/10) : 쿠폰을 10으로 나눈 몫만큼 서비스 치킨을 추가한다.
    • coupon = parseInt(coupon/10)+ coupon%10 : 서비스 치킨을 받으면서 새로 발급된 쿠폰(몫)과 남은 쿠폰(나머지)를 더해 새로운 쿠폰 수를 업데이트 한다.
  4. 누적된 서비스 치킨의 총 개수(answer)를 반환한다.
profile
영차영차 😎

2개의 댓글

comment-user-thumbnail
2024년 7월 10일

오랜만에 로그인하는데 진짜 열심히 기록하셨네여ㅜㅜ 진짜 갓생러... 저의 생활을 돌아보며 갑니다.. 멋
쪄요..

1개의 답글