🗃️javascript/프로그래머스

치킨 쿠폰(Lv.0)[]

하얀성 2023. 4. 1. 15:57

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


제한사항
  • chicken은 정수입니다.
  • 0 ≤ chicken ≤ 1,000,000

입출력 예chickenresult
100 11
1,081 120

입출력 예 설명

입출력 예 #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합니다.

<설계>

10장에 1마리 추가

최대 치킨 서비스 수


치킨 서비스 받으면 10마리 되는데
10마리 시키면

11마리 배달 오는거 가능?

100마리 시키면 10 서비스.  그리고 10서비스에서 1서비스 


x / 10 몫 나머지.

result에 몫을 더한다

몫 / 10  몫2 나머지.
 
result에 몫2를 더한다.

몫이 1 일때까지 반복한다.


난 언제 함수를 자연스럽게 쓸수 있을까?

function solution(chicken) {
    let result = 0;
    function nanum(chicken){
        let coupon = chicken / 10;
        result += coupon
        if(coupon == 1){
            return result
        }else{
            return nanum(nanum(chicken))
        }
    }
    return result
}

1081 / 10 108 +1
108 / 10  10   + 8
10  / 10  1   + 0
1   / 10  0   + 1
0   / 10  0   + 0

function solution(chicken) {
    let result = 0;
    let coupon = 0;  // 10으로 나누고 받아낸 쿠폰 갯수
    let coupon1 = 0; // 쿠폰 보관함
    while(true){
        coupon = chicken % 10
        coupon1 += coupon
        chicken = (chicken - coupon) / 10 
        console.log(coupon,"나머지")
        console.log(coupon1,"쿠폰보관")
        console.log(chicken,"몫")
        result += chicken // 10으로 나누어지는 만큼 먹을 수 있는 chicken 수 증가
        console.log(result,"!")
        if(chicken == 1){
            coupon1 += chicken % 10 // 마지막 10 나누고 남은 나머지가 쿠폰 보관함에 반영되게끔
            result += Math.floor(coupon1 / 10)
            break;
        }
    }
    return result
}


5281 / 10 528 + 1
528  / 10 52  + 8
52   / 10 5  + 2
5   /  10 0  + 1
0   /  10

1.치킨을 시킨다. 시킨만큼 쿠폰을 받는다. 
2. 시킨 쿠폰 수에서 10으로 나눠서 10개 묶음과 쩌리 쿠폰들을 따로 보관한다.
3. 묶음 갯수를 서비스 받은 치킨 수에 더한다.
4. 2,3번 과정을 반복한다.
5. 쩌리 쿠폰이 가득 찻다.
6. 서비스 받은 치킨수에 1을 더한다.(9개에서 9개 받더라도 20은 못넘기니깐 1개만 차오름.)
7. 쩌리 쿠폰 수 - 10

어? 나눴는데 치킨 쿠폰이 가득참. 언제 chicken에 더해줘야 될까?

 

function solution(chicken) {
    let result = 0;
    let coupon = 0;  // 10으로 나누고 받아낸 쿠폰 갯수
    let coupon1 = 0; // 쿠폰 보관함
    
    for(let i=1; i<=8; i++){
        coupon = chicken % 10
        coupon1 += coupon
        chicken = Math.floor((chicken - coupon) / 10)
        result += chicken // 10으로 나누어지는 만큼 먹을 수 있는 chicken 수 증가
        if(coupon1 >= 10){
            coupon1 -= 10
            result += 1 
        }
        if(chicken == 0){
            break;
        }
    }
    return result
}

3시간 풀다가 못풀어서 남에것 배꼈다.


<타인 풀이>

신박하다. 그래서 가져왔다.(제출 답안 아님)

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

    while (chicken > 0) {
        chicken--;
        coupon++;

        if (coupon >= 10) {
            coupon = 1;
            service++;
        }
    }

    return service;
}

ㅈㄴ 하기 싫다. 저번부터 한끝차이로 계속 못 풀어서 울고싶다. 

(오늘은 만우절임을 기억하자)