문제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` 값을 반환합니다.