JS 기본기능 응용관련

개요

내가 어떤 기능을 구현할 수 있는지 확인하고 그 구현으로 어떤문제를 풀 수 있는지 빠르게 확인하는 방향으로 접근하기로 했다.

코드

기본 내장 객체로 할 수 있는 것

기본적으로 모든 문제는 어떤 배열 or 집합으로 부터 시작한다고 생각한다. 다만 그 배열 혹은 집합 내부가 어떻게 생겼는지가 2차적인 문제라고 생각함.

중복제거 Set

key가 값인 Map하고 비슷하다

  • 추가된 순서가 유지된다
  • 같은 key값 add시 무시
const uniqueNumbers = [...new Set(numbers)];

const mySet = new Set();

mySet.add("값")
mySet.delete("값")
mySet.has("값");
mySet.size   // 전체 크기

비연속적인 key값이 있는 key:Value값에 유용한 Map

중요한 것은 단일 key값에 하나의 value만 들어갈 수 있다는 점이다.

  • 추가된 순서가 유지된다
  • 같은 key값 set 시 update
const dataMap = new Map();

// i 라는 인덱스에 데이터가 있으면 1증가 없으면 default값으로 1 생성
dataMap.set(i,dataMap.get(i)+1 ?? 1)

// true, false 반납
dataMap.has('키')

dataMap.delete('키')
dataMap.clear()

// value먼저 반환하는거 기억
dataMap.forEach((value, key)=>{console.log(value, key)})


dataMap.keys()  // {"키1", "키2", "키3"}
dataMap.values()  // {"값1", "값2", "값3"}
dataMap.entries()  // {["키1","값1"], ["키2","값2"], ["키3", "값3"]}

Array.from(dataMap, ([key,value])=>[key,value*2]) // 이 형태로 Iterator 객체를 Array객체로 바꿈  O(n)

특정 배열에서 누적되는 단일 오브젝트

계산하는 내부값들이 전부 리스트 안에 데이터가 있다면 reduce로 로직을 구성

// 배열 초기화
let arr = new Array(5).fill(0);


// 어떤 값이 있고 이게 순서대로 축적되는 형식일 때
const list = [{key:1, value:"값"}, {key:2, value:"값2"}];

const result = list.reduce((a,c) =>{
  return {key:c.key+a.key, value:c.value}
})

//min, max값의 응용도 처리 가능 -> 여러 항목에 대해서 복잡한 로직으로 판단해야할 때 사용하면 좋을듯
const numberArray =  [5, 2, 9, 8, 4, 5];
numberArray.reduce(
  (a, c) => {
    if (a.firstMax < c) {
      return { firstMax: c, secondMax: a.firstMax };
    } else if (a.secondMax < c) {
      return { firstMax: a.firstMax, secondMax: c };
    }
    return a;
  },
  { firstMax: -Infinity, secondMax: -Infinity }
);

이진탐색

첫 정렬이 되어 있어야함. 그 정렬에 대한 기준으로 이진탐색 가능

  • 기계적으로 구현 가능하도록 암기 필요
// 배열과 target , [start,end] 로 구성된 기본 반복문 구조
// 재귀보단 덜 직관적이나 stack을 덜 먹어서 좋음
// 공간복잡도 O(1)
function binarySearchWhile(arr, target, start, end) {
  const [minProcessTime, maxProcessTime] = [
    Math.min(...times),
    Math.max(...times),
  ];
  let [left, right] = [minProcessTime, maxProcessTime * n];

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);

    // 판단과정 재료 만들기

    if (판단로직) {
      answer = mid;
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }
  return left;
}