[Algorithm] JavaScript 1, 2차원 배열의 선언 및 초기화

Mubby·2022년 3월 31일
3

알고리즘(3xx)

목록 보기
1/3
post-thumbnail

오랫동안 풀지 않았던 알고리즘 문제를 다시 풀어보려는데 머리가 리셋 되었습니다.

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]

이외에도 JavaScript에는 배열의 다양한 초기화 방법이 있습니다.


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차원 배열의 선언 및 초기화 방법은 여기서 이만 줄이겠습니다.

포스팅의 계기가 된 녀석입니다. ( 소스 보러 가기 )

알고리즘 문제를 풀기 전 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" - 캐논 광고 카피 -

0개의 댓글