프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
제한사항
chicken
은 정수입니다.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을 반환한다.
let serviceChicken = Math.floor(coupons / 10);
: 서비스 치킨을 계산한다. 현재 쿠폰 수를 10으로 나눈 몫을 구해 치킨의 수를 계산한다.
const remainCoupon = coupons % 10;
: 남은 쿠폰을 계산한다. 현재 쿠폰 수를 10으로 나눈 나머지를 구해 남은 쿠폰 수를 계산한다.
return serviceChicken + aux(serviceChicken + remainCoupon);
: 재귀 호출
➡️ 서비스 치킨을 받으면 새로운 쿠폰이 발급된다. 그러므로 서비스 치킨 수와 남은 쿠폰 수를 더해서 다시 aux 함수를 호출한다.
➡️ 현재 계산된 서비스 치킨 수에 재귀 호출 결과를 더해서 반환한다.
function solution(chicken) {
var answer = parseInt((chicken-1) / 9);
return answer;
}
... 이게 이렇게 된다고? 수학 공부를... 해야 할까...
그냥 단순하게... parseInt((chicken-1) / 9)
를 계산해서 반환한당... 이게 주어진 치킨 수로 받을 수 있는 서비스 치킨의 수를 구해준다.
어떻게...?
chicken-1
을 해줌으로써 10장을 모으기 위한 기준을 9장으로 맞춘다.(chicken-1) / 9
는 주어진 치킨 수에서 10장 단위로 받을 수 있는 서비스 치킨의 수를 계산한다. 와...
스터디 멤버 중에서 이렇게 푼 사람 있을까 ? ㅎㅎ
암튼 수학적 사고를 통해서 이렇게 간단하게 푼 사람도 발견했다.
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;
}
answer = answer + parseInt(coupon/10)
: 쿠폰을 10으로 나눈 몫만큼 서비스 치킨을 추가한다. coupon = parseInt(coupon/10)+ coupon%10
: 서비스 치킨을 받으면서 새로 발급된 쿠폰(몫)과 남은 쿠폰(나머지)를 더해 새로운 쿠폰 수를 업데이트 한다.answer
)를 반환한다.
오랜만에 로그인하는데 진짜 열심히 기록하셨네여ㅜㅜ 진짜 갓생러... 저의 생활을 돌아보며 갑니다.. 멋
쪄요..