[알고리즘] Array DeepDive 해보기
1. 배열
- 같은 타입의 원소들을 효율적으로 관리 할 수 있는 자료형
리터럴 이용 방법
// 리터럴 이용 방법
const arr = [0, 0, 0, 0, 0, 0];
console.log(arr); // [0, 0, 0, 0, 0, 0]
배열 생성자 이용방법
// 배열 생성자 이용방법
const arr1 = new Array(0, 0, 0, 0, 0, 0);
const arr2 = [...new Array(6)].map((_, i) => i + 1);
console.log(arr2); // [1, 2, 3, 4, 5, 6]
Array.fill 메서드 이용방법
// Array.fill 메서드 이용방법
const arr3 = new Array(6).fill(0);
console.log(arr3); // [0, 0, 0, 0, 0, 0]
1차원 배열 - 배열은 차원과 무관하게 메모리에 연속 할당됌
2차원 배열 - 배열 안에 배열을 넣어서 만들 수 있음
// 2차원 배열 리터럴
const arr = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
];
// arr [2][3] 출력
console.log(arr[2][3]); // 12
// arr[2][3]= 15로 변경
arr[2][3] = 15;
console.log(arr[2][3]); // 15
// 크기가 3*4인 배열 선언
const arr = [...new Array(3)].map((_, i) => new Array(4).fill(i));
console.log(arr);
배열 연산 시간 복잡도 - 배열을 어디에 저장하냐에 따라 시간복잡도가 달라짐
- 맨뒤에 삽입할 경우 - O(1) : 다른 데이터의 위치에 영향을 안주기 때문에
- 맨앞에 삽입 할 경우 - O(n) : 다른 데이터의 위치를 옮겨야 하기 때문에
- 중간에 삽입 할 경우 - O(n) : 다른 데이터의 위치를 옮겨야 하기 때문에
배열 선택시 고려할점
- 할당할 수 있는 메모리 크기 확인하기 : 배열로 표현할 데이터가 많으면 배열 할당 실패
- 중간에 데이터 삽입이 많은지 확인하기 : 중간에 데이터 삽입이 많으면 그만큼 시간복잡도가 높아짐
배열 데이터 추가
// push 메서드로 데이터 추가
const arr = [1, 2, 3];
arr.push(4);
console.log(arr); // [1, 2, 3, 4]
// concat 메서드로 데이터 추가
let arr = [1, 2, 3];
arr = arr.concat(4, 5);
console.log(arr); // [1, 2, 3, 4, 5]
// 스프레드 연산자로 데이터 추가
let arr = [1, 2, 3];
arr = [...arr, ...[4, 5]];
console.log(arr); // [1, 2, 3, 4, 5]
// unshift 메서드로 데이터 맨앞에 추가(O(n)) - 데이터가 적을수록 적은 시간 복잡도를 가짐
let arr = [1, 2, 3];
arr.unshift(0);
console.log(arr); // [0, 1, 2, 3]
// splice 메서드로 중간에 데이터 추가 - splice(시작인덱스, 삭제할 요소 수, 추가할 요소)
const arr = [1, 2, 3, 4, 5];
arr.splice(2, 0, 10); // 2번째 인덱스부터 시작 , 삭제할 요소 수 0 , 추가할 요소 10
console.log(arr); // [1, 2, 10, 3, 4, 5]
배열 데이터 삭제
// pop 메서드로 맨 뒤 요소 삭제
const arr = [1, 2, 3, 4, 5];
arr.pop(); // 맨 뒤 요소 삭제
console.log(arr); // [1, 2, 3, 4]
// shift 메서드로 맨 앞 요소 삭제하고 반환
const arr = [1, 2, 3, 4, 5];
const shiftedElement = arr.shift();
console.log(shiftedElement); // 1
//splice 메서드로 중간 요소 삭제
const arr = [1, 2, 3, 4, 5];
const removedElement = arr.splice(2, 2); // 2번째 인덱스부터 시작 , 삭제할 요소 수 2
console.log(removedElement); // [3, 4]
console.log(arr); // [1, 2, 5]
고차 함수로 데이터에 연산 적용
// 배열 제곱 연산 - map 메서드로 제곱 연산
const numbers = [1, 2, 3, 4, 5];
const squares = numbers.map((value) => value * value);
console.log(squares); // [1, 4, 9, 16, 25]
// 짝수 필터링 - filter 메서드로 짝수만 필터링
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter((value) => value % 2 === 0);
console.log(evenNumbers); // [2, 4]
//전체 합 - reduce 메서드로 전체 합
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((a, b) => a + b); // 첫번째 인자는 이전까지 합쳐진 상태를 의미 , 두번째 인자는 순회하면서 바라보는 현재 요소
console.log(sum); // 15
//원리 예시
// 1. a=0 , b=1 => 0+1 = 1
// 2. a=1 , b=2 => 1+2 = 3
// 3. a=3 , b=3 => 3+3 = 6
// 4. a=6 , b=4 => 6+4 = 10
// 5. a=10 , b=5 => 10+5 = 15
// 6. 결과 15 (종료)