프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
입출력 예 #1
100마리를 주문하면 쿠폰이 100장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다.
10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
따라서 10 + 1 = 11 을 return합니다.
입출력 예 #2
1081마리를 주문하면 쿠폰이 1081장 발급되므로 서비스 치킨 108마리를 주문할 수 있습니다. 그리고 쿠폰이 1장 남습니다.
108마리를 주문하면 쿠폰이 108장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다. 그리고 쿠폰이 8장 남습니다.
10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
1마리를 주문하면 쿠폰이 1장 발급됩니다.
가지고 있는 쿠폰이 총 10장이므로 서비스 치킨 1마리를 추가로 주문할 수 있습니다.
따라서 108 + 10 + 1 + 1 = 120 을 return합니다.
원래 while문을 이용하려다가 조건을 어떻게 써야 할지 모르겠어서 for문으로 작성하였다.
테스트 케이스는 맞았지만 틀린 케이스들도 있고 런타임 에러도 있어서 (무엇보다 과정이 너무 복잡해..) 결국 다른 풀이를 참고했다.
function solution(chicken) {
let service = [];
let left = 0;
let n = 1;
for(i=0;i<100;i++){
n *= 10;
// 새로 받는 쿠폰 갯수(= 서비스 치킨 수)
let new_service = parseInt(chicken/n);
// 남은 쿠폰이 있는 경우 left에 더해주기
if(i == 0 && chicken/n !== new_service){
left += chicken - new_service*10;
}else if(i > 0 && service[i]/10 !== new_service){
left += service[i-1] - new_service*10;
}
// 남은 쿠폰이 10개일 경우 서비스 하나 추가하기 & 남은 쿠폰 제거
if(left == 10){
service.push(1);
left -= 10;
}
// 더 이상 서비스를 받을 수 없으면 멈추기
if(new_service == 0) break;
// 받을 수 있으면 서비스로 받는 치킨 수 넣기
service.push(new_service);
}
// 서비스로 받은 치킨 수 모두 더해주기
return service.reduce((a,b) => a+b);
}
쿠폰 수랑 치킨 수가 같다는 것과 반복문을 써서 서비스로 받을 수 있는 치킨 수를 계속 더해주어야 한다는 것은 감이 왔었는데, 남은 쿠폰 수를 어떻게 구해야 할지를 너무 복잡하게 생각했다.(그냥 % 이용하면 되는데!!)
그리고 조건식을 쿠폰의 개수에 대해 세워주면 되는 것을 놓친게 오답 포인트였던 것 같다.
function solution(chicken) {
let coupon = chicken;
let service = 0;
while(coupon >= 10){
service += parseInt(coupon/10)
coupon = parseInt(coupon/10)+ coupon%10
}
return service;
}