Bomb Kirby Running

코딩 테스트 챌린지

코딩 테스트 24

^. ̫ .^ 2023. 6. 8. 20:55

728x90

문제1 치킨쿠폰

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

 

제한사항

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

입출력 예

chicken result
100 11
1,081 120
function solution(chicken) {
  let coupon = 0;
  let serviceChicken = 0;

  coupon += chicken;

  while (coupon >= 10) {
    const order = Math.floor(coupon / 10);
    serviceChicken += order;
    coupon -= order * 10;
    coupon += order;
  }

  return serviceChicken;
}


`coupon` 변수를 초기화하고, 치킨 주문 수 `chicken`을 `coupon`에 더합니다.

반복문을 통해 `coupon`이 10 이상인 동안 다음 작업을 수행합니다:

서비스 치킨 수 `serviceChicken`에 `coupon`을 10으로 나눈 몫을 더합니다.

`coupon`을 10으로 나눈 나머지를 `coupon`에 할당합니다.
`coupon`을 `coupon`과 `coupon`을 10으로 나눈 몫의 합으로 업데이트합니다.

최종적으로, `serviceChicken`을 반환합니다.


문제2 이진수 더하기

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

 

제한사항

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

입출력 예

bin1 bin2
result
"10" "11" "101"
"1001" "1111" "11000"
function solution(bin1, bin2) {
  const maxLength = Math.max(bin1.length, bin2.length);

  bin1 = bin1.padStart(maxLength, '0');
  bin2 = bin2.padStart(maxLength, '0');

  let carry = 0; 
  let result = ''; 

  for (let i = maxLength - 1; i >= 0; i--) {
    const sum = parseInt(bin1[i]) + parseInt(bin2[i]) + carry; 
    result = (sum % 2) + result; 
    carry = Math.floor(sum / 2); 
  }

  if (carry === 1) {
    result = '1' + result;
  }

  return result;
}


주어진 두 이진수의 길이를 맞춥니다. 두 이진수의 길이가 다른 경우 짧은 이진수의 앞에 0을 추가하여 길이를 맞춥니다.
더한 결과를 저장할 빈 문자열 `result`를 초기화합니다.
이진수를 끝에서부터 한 자리씩 더해가면서 계산합니다.
현재 자리의 값과 이전 자리에서 올림 값을 더하여 2로 나눈 나머지를 구합니다. 이 값을 `result`에 추가합니다.

현재 자리의 값과 이전 자리에서 올림 값을 더하여 2로 나눈 몫을 다음 자리로 올림 값으로 설정합니다.

만약 마지막 계산 후에도 올림 값이 남아 있다면, `result`의 맨 앞에 1을 추가합니다.
`result`를 뒤집어서 반환합니다.

문제3 A로 B 만들기

문자열 before와 after가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

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

입출력 예

before after result
"olleh" "hello" 1
"allpe" "apple" 0
function solution(before, after) {
  if (before.length !== after.length) {
    return 0;
  }

  const sortedBefore = before.split('').sort().join('');
  const sortedAfter = after.split('').sort().join('');

  if (sortedBefore === sortedAfter) {
    return 1;
  } else {
    return 0;
  }
}

 

`before`와 `after`의 길이가 다르면 0을 반환합니다.
`before`와 `after`의 문자열을 정렬하여 순서를 일치시킵니다.
문자열을 배열로 분할하고, 배열을 정렬한 후 다시 문자열로 합치기 위해서 `split`, `sort`, `join` 메서드를 사용합니다.
`split`: 문자열을 특정 구분자를 기준으로 나누어 배열로 반환하는 메서드입니다. 예를 들어, `"hello".split('')`는 `['h', 'e', 'l', 'l', 'o']` 배열을 반환합니다. 여기서 `''`는 각 문자를 분리하는 구분자로 사용되었습니다.
`sort`: 배열을 정렬하는 메서드입니다. 기본적으로는 문자열로 구성된 배열을 사전식으로 정렬합니다. 예를 들어, `['h', 'e', 'l', 'l', 'o'].sort()`는 `['e', 'h', 'l', 'l', 'o']` 배열을 반환합니다.
`before`와 `after`를 각각 배열로 분할하고, 정렬한 후 다시 문자열로 합치면 `"ehllo"`라는 동일한 문자열이 생성됩니다. 이를 통해 `before`와 `after`의 문자 순서와 개수가 동일함을 확인할 수 있습니다.
`before`와 `after`가 동일하다면 1을 반환하고, 그렇지 않으면 0을 반환합니다.

 

문제4 k의 개수

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ i < j ≤ 100,000
  • 0 ≤ k ≤ 9

입출력 예

i j k result
1 13 1 6
10 50 5 5
3 10 2 0
function solution(i, j, k) {
  let count = 0;

  for (let num = i; num <= j; num++) {
    const digits = String(num).split('');

    for (const digit of digits) {
      if (Number(digit) === k) {
        count++;
      }
    }
  }

  return count;
}

 

 `i`부터 `j`까지의 모든 숫자를 반복합니다. 이를 위해 `num` 변수를 `i`로 초기화하고, `num`이 `j`보다 작거나 같을 때까지 반복문을 실행합니다.

각 숫자를 문자열로 변환합니다. `String(num)`을 통해 `num`을 문자열로 변환합니다.
변환된 문자열을 `split('')`을 사용하여 각 자리의 숫자를 배열로 분할합니다. `split('')`은 문자열을 빈 문자(`''`)로 분할하여 각 문자를 요소로 가지는 배열을 생성합니다.
분할된 각 자리의 숫자를 확인하기 위해 `for...of` 반복문을 사용합니다. `digit` 변수는 각 자리의 숫자를 나타냅니다.
`digit`을 숫자로 변환하여(`Number(digit)`) `k`와 비교합니다. 일치하는 경우, `count`를 증가시킵니다.

반복문이 종료되면 최종적인 `count` 값을 반환합니다.