코딩테스트 24일차
치킨 쿠폰
프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
function solution(chicken) {
var answer = 0;
var coupons = 0;
while (chicken >= 10) {
answer += Math.floor(chicken / 10); // 서비스 치킨의 수를 더함
coupons += chicken; // 쿠폰 발급
chicken = Math.floor(chicken / 10) + (chicken % 10); // 남은 치킨 수를 계산
}
return answer;
}
✏️풀이
chicken이 10 이상일 때까지 반복합니다.
각 반복에서 chicken을 10으로 나눈 몫을 answer에 더합니다. 이는 현재 주문한 치킨으로 받을 수 있는 서비스 치킨의 수입니다.
coupons에 chicken을 더합니다. 이는 현재 주문한 치킨으로 발급되는 쿠폰의 수입니다.
chicken을 10으로 나눈 몫과 나머지를 더하여 다음 반복에서 처리할 치킨의 수를 계산합니다.
반복이 끝난 후 answer를 반환합니다.
이진수 더하기
이진수를 의미하는 두 개의 문자열 bin1과 bin2가 매개변수로 주어질 때, 두 이진수의 합을 return하도록 solution 함수를 완성해주세요.
function solution(bin1, bin2) {
var answer = '';
var carry = 0; // 올림 수를 저장하는 변수
// 두 이진수의 길이를 맞추기 위해 더 짧은 이진수 앞에 0을 채움
while (bin1.length < bin2.length) {
bin1 = '0' + bin1;
}
while (bin2.length < bin1.length) {
bin2 = '0' + bin2;
}
// 끝에서부터 한 자리씩 덧셈 수행
for (var i = bin1.length - 1; i >= 0; i--) {
var sum = parseInt(bin1[i]) + parseInt(bin2[i]) + carry; // 현재 자리의 덧셈
answer = (sum % 2) + answer; // 현재 자리의 결과를 정답에 추가
carry = Math.floor(sum / 2); // 올림 수 계산
}
// 마지막 올림 수가 남아있을 경우 정답에 추가
if (carry > 0) {
answer = carry + answer;
}
return answer;
}
✏️풀이
주어진 두 이진수의 길이를 맞추기 위해 더 짧은 이진수 앞에 0을 채웁니다. 이렇게 하면 두 이진수의 길이가 같아지고, 각 자리끼리 1:1로 대응됩니다.
끝에서부터 한 자리씩 덧셈을 수행합니다. 현재 자리의 값을 정수로 변환한 후, 두 이진수의 해당 자리 값과 올림 수를 더합니다.
현재 자리의 덧셈 결과를 2로 나눈 나머지를 정답에 추가합니다.
올림 수는 현재 자리의 덧셈 결과를 2로 나눈 몫입니다.
마지막으로 남은 올림 수가 있을 경우, 정답에 추가합니다.
최종적으로 구한 정답을 반환합니다.
A로 B 만들기
문자열 before와 after가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.
function solution(before, after) {
var answer = 0;
// 문자열 before과 after를 정렬하여 정렬된 결과가 같은지 확인
var sortedBefore = before.split('').sort().join('');
var sortedAfter = after.split('').sort().join('');
if (sortedBefore === sortedAfter) {
answer = 1;
}
return answer;
}
✏️풀이
before와 after 문자열을 각각 정렬하여 정렬된 결과를 sortedBefore와 sortedAfter로 저장합니다.
sortedBefore와 sortedAfter가 같은지 비교하여 같다면 answer를 1로 설정합니다.
정렬된 결과가 같다는 것은 문자열의 순서를 바꾸어도 동일한 문자들로 구성되어 있다는 의미입니다.
예를 들어, "olleh"를 정렬하면 "ehllo"가 되고, "hello"를 정렬하면 "ehllo"가 됩니다.
최종적으로 answer 값을 반환합니다.
k의 개수
1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.
function solution(i, j, k) {
var answer = 0;
for (var num = i; num <= j; num++) {
var digits = num.toString().split(''); // 숫자를 문자열로 변환한 후, 각 자리수를 배열로 분리
var count = 0; // k가 등장하는 횟수를 저장하는 변수
// 배열의 각 자리수를 확인하여 k가 등장하는지 검사
for (var digit of digits) {
if (parseInt(digit) === k) {
count++;
}
}
answer += count; // 등장 횟수를 누적하여 answer에 추가
}
return answer;
}
✏️풀이
num 변수를 i부터 j까지의 수로 초기화합니다.
num을 문자열로 변환한 후, 각 자리수를 배열로 분리하여 digits에 저장합니다.
count 변수를 0으로 초기화합니다. 이 변수는 k가 등장하는 횟수를 저장하는 용도로 사용됩니다.
digits 배열의 각 자리수를 순회하며 k가 등장하는지 검사합니다.
각 자리수를 정수로 변환하여 k와 비교합니다.
만약 같다면 count를 1 증가시킵니다.
count를 answer에 누적하여 등장 횟수를 계산합니다.
num을 다음 수로 업데이트하고, 2번부터 5번까지의 과정을 반복합니다.
최종적으로 answer 값을 반환합니다.