문제를 풀면서 문제의 의도와 연관된 개념에 대해 정리합니다.
JSON.parse의 결과로 주어지는 객체 또는 배열이 비어 있는지 시간 복잡도 O(1)로 판단하기
JSON.stringify를 이용한 풀이는 O(n)
for in 이용한 풀이
function isEmpty(obj: Obj): boolean {
for(const _ in obj) {
return false;
}
return true;
};
for in문은 enumerable 속성만 순회하므로 빈 객체인 경우 반복문이 실행되지 않음enumerable: false 인 속성만 존재하는 경우 for in문을 순회하지 않음enumerable: false 인 속성만 존재한다면 비어있는 것처럼 보이는 것이지 실제로는 속성이 존재함enumerable: false 인 속성은 언제 사용하지?배열을 일정한 크기로 잘라 새로운 2차원 배열로 만들기
size가 배열보다 클 때size보다 작을 때JavaScript 프로토타입 확장 이해하기
last 메서드 추가하기this 바인딩에 대한 이해this가 호출된 배열 자체로 바인딩된다는 점 활용this가 배열을 가리키지 않음groupBy 직접 구현하기
배열을 fn이 반환하는 숫자값을 기준으로 배열을 정렬하기
두 개의 객체 배열을 id 기반으로 병합하기
id를 가진 객체를 하나로 합치는 병합 로직 구현id 같은 객체가 존재한다면 arr2가 arr1을 overridefindIndex로 풀었다가 시간 초과 발생함findIndex + sort ⇒ O(n*m) + O(k log k)Map 객체로 풀이 변경Map.has + sort ⇒ O(n + m + k log k)id 기준으로 정렬Array.flat 메서드 직접 구현하기
n레벨까지 flatten 처리
시간 복잡도 O(n) 고려
TypeScript + stack 으로 풀 때 타입 에러
const stack = arr.map(item => [item, 0]); 의 타입이 의도한대로 추론되지 않음type StackElement = [MultiDimensionalArray, number]type StackElement = Array<number | MultiDimensionalArray> var flat = function (arr: MultiDimensionalArray, n: number): MultiDimensionalArray {
if(n === 0) return arr;
const result = [];
const stack = arr.map(item => [item, 0]).reverse();
while (stack.length > 0) {
const stackElement = stack.pop();
const item = stackElement[0] as MultiDimensionalArray;
const depth = stackElement[1] as number;
if (Array.isArray(item) && depth < n) {
for(let index = item.length - 1; index >= 0; index -= 1){
stack.push([item[index], depth + 1])
}
} else {
result.push(item);
}
}