정수 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매개변수
JavaScript 배열을 초기화할 때 채워넣을 요소. 단, 항목이 하나 뿐이며 그 항목의 자료형이 숫자일 경우 아래의 arrayLength 매개변수로 간주합니다.
fill()함수
arr.fill(value[, start[, end]])
Copy to Clipboard매개변수
배열을 채울 값.
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" }]
'🗃️javascript > 프로그래머스' 카테고리의 다른 글
외계행성의 나이(Lv.0)[문자열 활용문제 -> 문자+ 문자 = 문자열] (0) | 2023.01.04 |
---|---|
배열 회전시키기(Lv.0)[간단배열이동 적용끝판왕, slice(),splice() 상세설명] (0) | 2023.01.04 |
나머지가 1이 되는 수 찾기(Lv.1)[반복문 안의 return 값] (0) | 2023.01.04 |
문자열을 정수로 바꾸기(Lv.1)[문자열과 숫자의 사칙연산 결과 = 숫자] (0) | 2023.01.04 |
x만큼 간격이 있는 n개의 숫자(Lv.1)[for반복문을 map()로 응용] (0) | 2023.01.04 |