[기초 Lv.0] 배열 만들기 2

oaksusu·2024년 3월 16일
0
post-thumbnail

오답노트 20번

1. 문제 (링크) :

정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.

[조건]
1 ≤ l ≤ r ≤ 1,000,000

2. 내가 푼 방법 : 풀지 못함

정수 중에서 숫자 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를 곱하면 된다는 사실을 알았다해도 구현하는것까지도 못했을것같아
이왕 이렇게 된거 이진수로 된 배열들을 만드는 법에 대해 공부해야겠다.

3. 괜찮아 보였던 풀이 방법 (참고할 만한 풀이):

3-1. 쉬운 버전 : every 사용

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]
}

3-2. 난이도가 높은? 버전 : 이진수를 사용 (+ 제너레이터 함수, yield 사용)

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에서 정리

profile
삐약

0개의 댓글