본문 바로가기
코딩테스트/프로그래머스 0단계 - 입문

프로그래머스 0단계 입문 - 치킨 쿠폰 / 이진수 더하기

by 학습하는 청년 2024. 4. 24.

치킨 쿠폰

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

  • chicken은 정수입니다.
  • 0 ≤ chicken ≤ 1,000,000
function solution(chicken) {
  let coupon = chicken; // 현재 쿠폰의 수
  let serviceChicken = 0; // 서비스 치킨의 수
    
  while(coupon > 9) {
    serviceChicken += Math.floor(coupon / 10);
    coupon = Math.floor((coupon / 10) + ( coupon % 10));
  }
    
  return serviceChicken;
}

1. 치킨 한 마리당 쿠폰이 발급된다.

2. serviceChicken 값 초기화

3. 쿠폰은 10장부터 사용할 수 있으므로, 10장 이상부터 서비스 치킨++

4. 쿠폰은 10장마다 또 하나의 쿠폰이 나오는 것처럼 서비스 치킨이 제공된다.


이진수 더하기

이진수를 의미하는 두 개의 문자열 bin1과 bin2가 매개변수로 주어질 때, 두 이진수의 합을 return하도록 solution 함수를 완성해주세요.

  • return 값은 이진수를 의미하는 문자열입니다.
  • 1 ≤ bin1, bin2의 길이 ≤ 10
  • bin1과 bin2는 0과 1로만 이루어져 있습니다.
  • bin1과 bin2는 "0"을 제외하고 0으로 시작하지 않습니다.
function solution(bin1, bin2) {
   const a = parseInt(bin1, 2)
   const b = parseInt(bin2, 2)

   return (a + b).toString(2)
}

// 다른 풀이 방법
function solution(bin1, bin2) {
  let temp = Number(bin1) + Number(bin2);
  temp = [...temp.toString()].reverse().map((v) => +v);

  for (let i = temp.length; i < 11; i++) {
    temp.push(0);
  }

  for (let i = 0; i < temp.length; i++) {
    if (temp[i] === 2) {
      temp[i] = 0;
      temp[i + 1]++;
    } else if (temp[i] === 3) {
      temp[i] = 1;
      temp[i + 1]++;
    }
  }
  return Number(temp.reverse().join("")).toString();
}

parseInt는 문자열을 특정 진수로 반환하는 메소드이다. parseInt(bin1) 이라고만 작성할 경우에는 10진수로 변환된다. 두 번째 인수로는 변환할 진수를 매개변수로 설정할 수 있다.

 

1) 각각의 문자열을 2진수로 변환하여 계산한다.

2) 계산된 값을 다시 문자열로 변환한다.

 

<다른 풀이 방법에 대한 해설>

아직 이해를 못 하겠다.

저희가 2진수 덧셈할때 2가 되면 왼쪽 자리에 1을 더하잖아요? 왼쪽자리에 1을 더해서 거기도 2가 되면 또 그 왼쪽 자리에 1을 더하고... 이걸 반복하게 되는데 자바스크립트로는 반복문이 오른쪽으로 진행되잖아요? 그래서 reverse하셔서 반복문 돌리고 다시 reverse한 후 합치신겁니다.

 

반올림이 생길 수 있으므로 0을 Push해줍니다. 11만큼 푸시해주는 이유는 bin1 과 bin2의 길이가 10이하인 것을 고려해서 입니다

댓글