정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.
[조건]
1 ≤ l ≤ r ≤ 1,000,000
정수 중에서 숫자 0과 5로만 숫자의 규칙성을 찾고자 나열을 해봤을때,
0, 5, 50, 55, 500, 505, 550, 555 ...이렇게 흘러갔다.
한 자리 수에서는 0하고 5밖에 사용못하니 2개(0, 5)가 있고,
두 자리 수에서는 일의 자리에서는 0,5 십의 자리에서도 0,5만 쓰이니 2 x 2 = 4개가 있음
(0, 5, 50, 55)
조건에서 1,000,000까지의 숫자라고 했으니 6자리의 수까지만 생각하면 돼서 총 2의 6승인 64개의 숫자들이 있다라고 판단했다.
그렇다면 알아낸 정보로 어떻게 64개의 숫자들을 만들어낼 수 있을까 고민해봤지만 한시간이 넘도록 찾지 못해서 결국 구글링 했다.
구글링한 결과 이진수에 5가 곱해진 것으로 생각해내면 된거였다..!
이진수에 5를 곱하면 된다는 사실을 알았다해도 구현하는것까지도 못했을것같아
이왕 이렇게 된거 이진수로 된 배열들을 만드는 법에 대해 공부해야겠다.
l부터 r까지 for문을 돌면서 0하고 5로만 이뤄진 숫자를 새로운 배열에 푸쉬한 뒤 해당 배열을 반환하기
function solution(l, r) {
var answer = [];
for (let i = l; i <= r; i++) {
const test = i.toString().split('').every((ele) => (ele.includes('0')) || (ele.includes('5')));
if (test) {
answer.push(i)
}
}
return answer.length ? answer : [-1]
}
function* gen50() {
let i = 1;
while(true) {
yield Number(Number(i).toString(2)) * 5;
i++;
}
}
function solution(l, r) {
const n = gen50();
let a = 0;
const arr = [];
while(a < l) { a = n.next().value; }
while(a <= r) { arr.push(a); a = n.next().value; }
return arr.length ? arr : [-1];
}
제너레이터 함수와 yield는 따로 공부가 필요하여 TIL에서 정리