프로그래머스 Lv1
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
x | n | answer |
---|---|---|
2 | 5 | [2,4,6,8,10] |
4 | 3 | [4,8,12] |
-4 | 2 | [-4, -8] |
function solution(x, n) { let answer = []; let sum = 0; for(let i=0; i<=n-1; i++){ sum = x + x*i; answer.push(sum); } return answer; }
function solution(x, n) { return Array(n).fill(x).map((el,i) => (i+1) * x); } // i+1 -> i는 0부터 시작하기 때문
이 풀이에서 'Array(n).fill()' 으로 바꾸어 작성하여도 문제가 풀리기는 한다. 비록 'Array(n).fill()' 의 값이
[ undefined, undefined, undefined, undefined ]이긴 하지만. 데이터가 존재하지 않는 배열을 쓸 때에 어떤 문제가 있는지 더 살펴봐야겠다.
Array()와 fill(), map() 을 통해 풀었다.
: 배열을 생성하는데는 예전 방식인 new 명령을 사용하는 방법과 리터럴 표기법(literal notation) 을 사용하여 생성하는 방식이 있습니다. (출처)
: 배열은 일반적으로 배열 리터럴 방식으로 생성하지만 배열 리터럴 방식도 결국 내장 함수 Array() 생성자 함수로 배열을 생성하는 것을 단순화시킨 것이다.
: Array() 생성자 함수는 매개변수의 갯수에 따라 다르게 동작한다.
매개변수가 1개이고 숫자인 경우 ✅매개변수로 전달된 숫자를 length 값으로 가지는 빈 배열을 생성한다.
// 매개변수로 하나의 숫자를 가지는 경우
const arr = new Array(2);
console.log(arr); // (2) [empty × 2]
// 매개변수로 전달된 값들을 요소로 가지는 배열을 생성하는 경우
const arr = new Array(1, 2, 3);
console.log(arr); // [1, 2, 3]
: 메서드는 배열의 시작 인덱스부터 끝 인덱스의 이전까지 정적인 값 하나로 채웁니다
arr.fill ( value [, start [, end]])
- 매개변수
- value
: 배열을 채울 값.- start( Optional )
: 시작 인덱스, 기본 값은 0.- end ( Optional )
: 끝 인덱스, 기본 값은 this.length.
const array1 = [1, 2, 3, 4];
// fill with 0 from position 2 until position 4
console.log(array1.fill(0, 2, 4));
// expected output: [1, 2, 0, 0]
// fill with 5 from position 1
console.log(array1.fill(5, 1));
// expected output: [1, 5, 5, 5]
console.log(array1.fill(6));
// expected output: [6, 6, 6, 6]
map() 메서드는 배열 내의 모든 요소 각각에 대하여 ✅ 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환합니다.
arr.map( callback ( currentValue [, index [, array ]])[, thisArg])
- 매개변수
- callback
: 새로운 열 요소를 생성하는 함수. 다음 세 가지 인수를 가집니다.- currentValue
: 처리할 현재 요소.- index ( Optional )
: 처리할 현재 요소의 인덱스.- array ( Optional )
: map()을 호출한 배열.- thisArg ( Optional )
: callback을 실행할 때 this로 사용되는 값.
function solution(x, n) { return nNumbers(x,n); } const nNumbers = (x, n)=>{ return Array.from({length: n},(v,index)=>(index+1)*x); };
es6에 새로 도입된 Array.from()을 사용하여 문제를 풀었다.
ES6에서 새롭게 도입된 Array.from 메소드는 유사 배열 객체(array-like object) 또는 이터러블 객체(iterable object) 를 변환하여 새로운 배열을 생성한다.
// 문자열은 이터러블이다.
const arr1 = Array.from('Hello');
console.log(arr1); // [ 'H', 'e', 'l', 'l', 'o' ]
// 유사 배열 객체를 새로운 배열을 변환하여 반환한다.
const arr2 = Array.from({ length: 2, 0: 'a', 1: 'b' });
console.log(arr2); // [ 'a', 'b' ]
// Array.from의 두번째 매개변수에게 배열의 모든 요소에 대해 호출할 함수를 전달할 수 있다.
// 이 함수는 첫번째 매개변수에게 전달된 인수로 생성된 배열의 모든 요소를 인수로 전달받아 호출된다.
const arr3 = Array.from({ length: 5 }, function (v, i) { return i; });
console.log(arr3); // [ 0, 1, 2, 3, 4 ]
function solution(x, n) { return [...Array(n).keys()].map(v => (v + 1) * x); }
위의 코드를 보면 Spread문법을 사용한다. 그 이유는 Spread 문법을 이용하면 iterable 객체를 해체 할 수 있다.
: 배열의 각 인덱스를 키 값으로 가지는 새로운 Array Iterator 객체를 반환합니다.
Array Iterator 객체를 반환하는 함수는 다음의 함수들이 있다.
const array1 = ['a', 'b', 'c'];
const iterator = array1.keys();
for (const key of iterator) {
console.log(key);
}
// >0
// >1
// >2
----------------------------------
const arr = [...Array(5).keys()];
console.log(arr);
// >[ 0, 1, 2, 3, 4 ]
ES6에서 Iterable protocol 이 추가 되었고, Iterable protocol의 2가지 형태로는 iterable 과 iterator 이 있다. 이 부분에 대해서는 아직 명확하게 이해를 하지 못하여서 따로 정리하여야겠다.
-- 새삼 느낀점 --
알고리즘을 풀어본 적은 없지만 lv1 이라서 쉽다고 생각하였고, 풀고 나서도 쉽다고 생각하였다. 하지만, 되도 않는 자만이었다.....
훨씬 간결하게 푼 코드를 통해 많은 공부와 자극이 된 것 같다. 또 어제 배운 함수형 프로그래밍을 사용한 예를 느낄 수 있었다.