“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”
코딩테스트 입문 Day 24 수학, 시뮬레이션, 문자열, 조건문, 반복문
치킨쿠폰
문제
프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.
제한사항
- chicken은 정수입니다.
- 0 ≤ chicken ≤ 1,000,000
입출력 예
chicken | result |
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합니다.
solution.js
function solution(chicken) {
var answer = parseInt((chicken-1) / 9);
return answer;
}
- chicken이라는 매개변수를 받아들여서 처리합니다. 함수 내부에서는 chicken에서 1을 뺀 뒤, 그 값을 9로 나눈 몫을 계산하여 answer 변수에 저장합니다. 마지막으로 answer 값을 반환합니다.
- 예를 들어, chicken 값이 10이라면, 함수 내부에서는 (10-1) / 9를 계산하게 되고, 이는 1.1111...의 값을 가집니다. 하지만 parseInt 함수를 사용하여 소수 부분을 제거하고 정수 부분인 1만을 남기게 됩니다. 따라서 함수는 1을 반환합니다.
- 이 함수는 chicken 값에서 1을 뺀 뒤, 9로 나눈 몫을 계산하는 것으로 보아, chicken이 어떤 의미를 가지는지에 따라 반환되는 값이 달라질 수 있습니다. 함수의 이름이나 문맥에 따라 해당 값이 어떤 의미를 갖는지 알 수 있을 것입니다.
이진수 더하기
문제
이진수를 의미하는 두 개의 문자열 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" |
입출력 예 설명
입출력 예 #1
- 10 + 11 = 101 이므로 "101" 을 return합니다.
입출력 예 #2
- 1001 + 1111 = 11000 이므로 "11000"을 return합니다.
solution.js
function solution(bin1, bin2) {
var answer = '';
var carry = 0;
while (bin1.length < bin2.length) {
bin1 = '0' + bin1;
}
while (bin1.length > bin2.length) {
bin2 = '0' + bin2;
}
for (var i = bin1.length - 1; i >= 0; i--) {
var bit1 = parseInt(bin1[i]);
var bit2 = parseInt(bin2[i]);
var sum = bit1 + bit2 + carry;
if (sum >= 2) {
carry = 1;
sum -= 2;
} else {
carry = 0;
}
answer = sum + answer;
}
if (carry === 1) {
answer = carry + answer;
}
return answer;
}
- answer 변수를 빈 문자열로 초기화하고, carry 변수를 0으로 초기화합니다.
- bin1과 bin2의 길이를 맞추기 위해 더 짧은 이진수의 앞에 0을 추가합니다. 이 작업을 while 루프를 사용하여 반복합니다.
- 이진수의 각 자릿수를 오른쪽부터 왼쪽으로 반복하면서 덧셈을 수행합니다. 이를 위해 for 루프를 사용하고, 루프 변수 i를 bin1의 길이에서 1씩 감소시키면서 반복합니다.
- 각 자릿수에서 bin1과 bin2의 해당 위치의 비트(bit1과 bit2)를 정수로 변환합니다.
- bit1, bit2, 그리고 carry 값을 더하여 sum을 계산합니다.
- 만약 sum이 2 이상인 경우, 올림(carry)이 발생한 것이므로 carry 값을 1로 설정하고 sum에서 2를 뺍니다.
- 그렇지 않은 경우(sum이 1 이하인 경우), carry 값을 0으로 설정합니다.
- sum 값을 answer의 왼쪽에 추가합니다.
- carry 값이 1인 경우, 가장 왼쪽 자릿수에 올림이 발생한 것이므로 answer의 가장 왼쪽에 carry 값을 추가합니다.
- 최종적으로 answer를 반환합니다.
A로 B 만들기
문제
문자열 before와 after가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 < before의 길이 == after의 길이 < 1,000
- before와 after는 모두 소문자로 이루어져 있습니다.
입출력 예
before | after | result |
"olleh" | "hello" | 1 |
"allpe" | "apple" | 0 |
입출력 예 설명
입출력 예 #1
- "olleh"의 순서를 바꾸면 "hello"를 만들 수 있습니다.
입출력 예 #2
- "allpe"의 순서를 바꿔도 "apple"을 만들 수 없습니다.
solution.js
function solution(before, after) {
if (before.length !== after.length) {
return 0;
}
var sortedBefore = before.split('').sort().join('');
var sortedAfter = after.split('').sort().join('');
if (sortedBefore === sortedAfter) {
return 1;
} else {
return 0;
}
}
- 만약 before와 after의 길이가 다르다면, 즉 서로 다른 문자열이라면 0을 반환합니다.
- before와 after를 각각 문자 단위로 분리하고, 정렬한 뒤 다시 합쳐서 새로운 문자열 sortedBefore와 sortedAfter를 생성합니다.
- sortedBefore와 sortedAfter를 비교하여 값이 동일하다면, 즉 문자열이 동일한 문자로 구성되어 있다면 1을 반환합니다.
- 그렇지 않은 경우, 즉 문자열이 다른 문자로 구성되어 있다면 0을 반환합니다.
이 함수의 목적은 before와 after 문자열이 동일한 문자로 구성되어 있는지를 확인하는 것입니다. 함수는 두 문자열의 길이를 비교하고, 정렬한 후에 비교하여 같으면 1을 반환하고, 다르면 0을 반환합니다. 이를 통해 두 문자열이 동일한 문자로 구성되어 있는지 여부를 판단할 수 있습니다.
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 |
입출력 예 설명
입출력 예 #1
- 본문과 동일합니다.
입출력 예 #2
- 10부터 50까지 5는 15, 25, 35, 45, 50 총 5번 등장합니다. 따라서 5를 return 합니다.
입출력 예 #3
- 3부터 10까지 2는 한 번도 등장하지 않으므로 0을 return 합니다.
solution.js
function solution(i, j, k) {
var answer = 0;
for (var num = i; num <= j; num++) {
var digits = String(num).split('');
var count = 0;
for (var digit of digits) {
if (Number(digit) === k) {
count++;
}
}
answer += count;
}
return answer;
}
- answer 변수를 0으로 초기화합니다.
- i부터 j까지의 모든 수에 대해 반복문을 실행합니다. 이를 위해 num 변수를 i로 초기화하고, num이 j보다 작거나 같은 동안 반복합니다.
- 각 숫자 num을 문자열로 변환한 뒤, digits 변수에 각 자릿수를 분리하여 저장합니다. 이를 위해 String(num)으로 num을 문자열로 변환하고, split('') 메소드를 사용하여 각 자릿수를 배열로 분리합니다.
- count 변수를 0으로 초기화합니다. 이 변수는 k와 일치하는 숫자의 개수를 세는데 사용됩니다.
- digits 배열의 각 자릿수(digit)에 대해 반복문을 실행합니다.
- 만약 digit을 숫자로 변환한 값(Number(digit))이 k와 같다면, count를 1 증가시킵니다.
- answer에 count 값을 더합니다.
- 반복문이 종료되면 answer 값을 반환합니다.
이 함수의 목적은 i부터 j까지의 숫자들 중에서 각 숫자의 자릿수에 k가 몇 번 등장하는지를 계산하여 그 총합을 반환하는 것입니다. 함수는 주어진 범위 내에서 각 숫자를 문자열로 변환하고, 각 자릿수를 분리하여 순회하면서 k와 일치하는 숫자의 개수를 세고, 이를 answer에 누적하여 저장합니다. 마지막으로 answer 값을 반환합니다.