오랫동안 풀지 않았던 알고리즘 문제를 다시 풀어보려는데 머리가 리셋 되었습니다.
JavaScript의 배열 선언 및 초기화 방법도 생각이 나지 않는 지경에 이르러 다시 공부하면서 정리했습니다.
원초적인 JavaScript 배열 선언
const arr = []; // => Array(0) [ ]
직접 초기화
const arr = [0, 0, 0, 0, 0];
// => Array(5) [0, 0, 0, 0, 0]
반복문을 통한 초기화
let arr = new Array(5);
for (let i = 0; i < arr.length ; i++) {
arr[i] = 0;
}
// => Array(5) [0, 0, 0, 0, 0]
JavaScript의 Array는 객체(함수)이며, new Array()를 사용할 수 있습니다. new Array()의 첫 번째 매개변수로 배열의 길이를 넘겨서 특정 길이로 배열을 생성할 수 있습니다.
const arr = new Array(5);
// => Array(5) []
아래와 같이 new Array()의 매개변수에 원하는 초기값들을 넘겨주는 방법으로 생성과 초기화를 동시에 할 수 있지만, 좋은 방법은 아닙니다.
const arr = new Array(0, 0, 0, 0, 0);
// => Array(5) [0, 0, 0, 0, 0]
Array.from()으로 길이가 5인 배열 생성 및 0으로 초기화
const arr = Array.from({length: 5}, () => 0);
// => Array(5) [0, 0, 0, 0, 0]
Array.from()의 두번째 매개변수로 원하는 값을 반환하는 콜백함수를 넘겨주어 값이 1씩 증가하는 배열도 생성할 수 있습니다.
const arr = Array.from({length: 5}, (v, i) => i);
// => Array(5) [0, 1, 2, 3, 4]
Array.fill() 이용
const arr = new Array(5).fill(0);
// => Array(5) [0, 0, 0, 0, 0]
Array.fill() 부연 설명
- 배열의 시작 인덱스부터 끝 인덱스의 이전까지 정적인 값 하나로 채움
- ES6에서 등장한 fill을 이용한 방법은 for문을 이용하는 방법과 성능 면에서도 크게 차이가 없고 코드가 간결합니다. 따라서 일반적인 경우 가장 선호되는 방법입니다.
- new Array(N)는 속도가 느리기 때문에 다음과 같은 방법을 사용하는 것이 더 빠릅니다.
let arr; (arr = []).length = 5; arr.fill(0);
Array.apply() 이용
const arr = Array.apply(null, new Array(5)).map(Number.prototype.valueOf,0);
// => Array(5) [0, 0, 0, 0, 0]
포스팅의 계기가 된 녀석입니다. ( 소스 보러 가기 )
알고리즘 문제를 풀기 전 1씩 증가하는 2차원 배열을 생성해야 했습니다.
- JavaScript ‘배열의 배열’ 선언
JavaScript는 진정한 2차원 배열은 없다고합니다. 그렇기 때문에var arr = [][];
처럼 한 번에 2차원 배열 선언이 불가능합니다.
하지만 약간의 트릭을 통하여 2차원 배열 같은 ‘배열의 배열’을 만들 수 있습니다.
2차원 배열 생성 및 0으로 초기화
const rows = 5;
const columns = 5;
const arr = Array.from(new Array(columns), () => new Array(rows).fill(0));
1씩 증가하는 2차원 배열 생성
1. const arr1 = Array.from({ length: 5 }, (v, r)
=> { return Array.from({ length: 5 }, (v, c)
=> (r * 5) + (c + 1)) });
2. const arr2 = Array.from(new Array(rows), ()
=> new Array(columns).fill(1)).map((row, r) => row.map((v, c)
=> (r * columns) + (c + 1)));
(BEST)
3. const arr3 = [...Array(rows)].map((v, r)
=>[...Array(columns)].map((v, c)
=>(r * columns) + (c + 1)));
Array(5) [Array(5), Array(5), Array(5), Array(5), Array(5)]
[
0: (5) [1, 2, 3, 4, 5],
1: (5) [6, 7, 8, 9, 10],
2: (5) [11, 12, 13, 14, 15],
3: (5) [16, 17, 18, 19, 20],
4: (5) [21, 22, 23, 24, 25]
]
length: 5
"Records Is The Rule Of Memory" - 캐논 광고 카피 -