🗃️javascript/프로그래머스

약수 구하기(Lv.0)[for문 if문을 map()과 filter()로 변경](Array, fill 알아보기)

하얀성 2023. 1. 4. 14:43
<문제 설명>

 

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.


제한사항
  • 1 ≤ n ≤ 10,000

입출력 예nresult
24 [1, 2, 3, 4, 6, 8, 12, 24]
29 [1, 29]

입출력 예 설명

입출력 예 #1

  • 24의 약수를 오름차순으로 담은 배열 [1, 2, 3, 4, 6, 8, 12, 24]를 return합니다.

입출력 예 #2

  • 29의 약수를 오름차순으로 담은 배열 [1, 29]를 return합니다.

<제출 답안>

 

function solution(n) {
    let result = 0;
    let result = n.map((x,i) => result.push(n % i == 0),1)
    
}

 

ㅡㅡㅡㅡㅡㅡ> 1차 시도 실패.


function solution(n) {
    let result = [];
    for(let i = 1; i<=n; i++) {
        if(n % i === 0){
            result.push(i)
        }
    }
    return result
}

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ> 2차 시도 성공 하지만 내가 원하는 map과 filter을 통한 코드가 아님.


내가 원하는 것은 1차시도처럼 map을 반복문으로, filter()를 if문으로 활용하여 코드짜기.

 

<1차 시도의 올바른 결과>


function solution(n) {
    return Array(n).fill(0).map((v, index) => v+index+1).filter((v) => n%v===0);
}

[해설]

n의 0번째 요소부터 채워라. n[0] = 0+0+1 = 1 // n[1] = 0 + 1 + 1 =2 // n[2] = 0+2+1 =3 .............. 반복 하면서


만약 v가 n과 나눠서 몫이 0이라는 조건을 만족하면 따로 그 v를 뽑아내서 

  

Array(n)라는 새 배열객체의 요소들에 값을 채우도록 하라.

 

fill(0)은 초기화를 모두 0으로 만들어놓은 상태.

 

ㅡㅡ> 저 변수v를 index를 통해 변화를 줘서, map의 변수가 filter함수 조건에 도달하게 함.

ㅡㅡ>  1부터 시작해서 index+1임. 혹시나 0부터 시작하려면 v+index면 됨.

 

ㅡㅡㅡ>

만약 같은 숫자가 아닌 1부터 45까지 모든 숫자를 출력하고 싶다면?

Array(45). fill(). map((v, i)=> i+1); 을 작성한다

여기서 fill()로 작성할 경우 undefined로 배열이 가득 채워지는데 map을 통해서 v라는 콜백 함수와 i라는 인덱스를 받아서

새로운 배열을 생성.

참고로 인덱스는 0부터 시작하여 i+1을 리턴하면 숫자를 1부터 시작할 수 있다  ( i+1가 아닌, i만 return하면 0부터 44로 채워진다)

 


map반복문 이해를 위한 참고코드:
var solution=n=>new Array(n).fill(1).map((_,i)=>i+1).filter(a=>!(n%a))

 


<보충>

Array() 생성자

Array() 생성자는 새로운 Array 객체를 생성할 때 사용합니다.

구문

    [element0, element1, ..., elementN]

    new Array(element0, element1[, ...[, elementN]])
    new Array(arrayLength)
Copy to Clipboard

매개변수

elementN

JavaScript 배열을 초기화할 때 채워넣을 요소. 단, 항목이 하나 뿐이며 그 항목의 자료형이 숫자일 경우 아래의 arrayLength 매개변수로 간주합니다.


fill()함수

 arr.fill(value[, start[, end]])
Copy to Clipboard

매개변수

value

배열을 채울 값.

start Optional

시작 인덱스, 기본 값은 0.

end Optional

끝 인덱스, 기본 값은 this.length.

반환 값

변형한 배열.

설명

fill 메서드는 value, start, end의 3개 인자를 가집니다. start와 end 인자는 선택 사항으로써 기본값으로 각각 0과, this 객체의 length를 가집니다.

length가 배열의 길이일 때, start가 음수이면 시작 인덱스는 length+start입니다. end가 음수이면 끝 인덱스는 length+end입니다.

fill은 일반 함수이며, this 값이 배열 객체일 필요는 없습니다.

fill 메서드는 변경자 메서드로, 복사본이 아니라 this 객체를 변형해 반환합니다.

value에 객체를 받을 경우 그 참조만 복사해서 배열을 채웁니다.

예제

[1, 2, 3].fill(4);               // [4, 4, 4]
[1, 2, 3].fill(4, 1);            // [1, 4, 4]
[1, 2, 3].fill(4, 1, 2);         // [1, 4, 3]
[1, 2, 3].fill(4, 1, 1);         // [1, 2, 3]
[1, 2, 3].fill(4, 3, 3);         // [1, 2, 3]
[1, 2, 3].fill(4, -3, -2);       // [4, 2, 3]
[1, 2, 3].fill(4, NaN, NaN);     // [1, 2, 3]
[1, 2, 3].fill(4, 3, 5);         // [1, 2, 3]
Array(3).fill(4);                // [4, 4, 4]
[].fill.call({ length: 3 }, 4);  // {0: 4, 1: 4, 2: 4, length: 3}

// Objects by reference.
var arr = Array(3).fill({}); // [{}, {}, {}]
arr[0].hi = "hi"; // [{ hi: "hi" }, { hi: "hi" }, { hi: "hi" }]