CodeKata [카카오 인턴] 보석 쇼핑

chaeruru·2021년 7월 29일
0

알고리즘 풀이

목록 보기
2/9

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/67258

나의 코드

function solution(gems) {
  let answer = [0, Number.MAX_SAFE_INTEGER];
  const totalLen = new Set([...gems]).size;

  const map = new Map();
  let lo = 0;
  for (let hi = 0; hi < gems.length; ++hi) {
    map.set(gems[hi], map.get(gems[hi]) + 1 || 1);
    if (map.size === totalLen && answer[1] - answer[0] > hi - lo)
      answer = [lo, hi];
    while (map.size === totalLen) {
      if (map.get(gems[lo]) === 1) map.delete(gems[lo]);
      else map.set(gems[lo], map.get(gems[lo]) - 1 || -1);
      if (answer[1] - answer[0] > hi - lo) answer = [lo, hi];
      ++lo;
    }
  }
  return answer.map((a) => a + 1);
}

풀이

투 포인터 알고리즘을 사용하였다.

우선 보석의 종류가 총 몇 개인지 totalLenSet.size 을 이용하여 저장한다.

투 포인터 알고리즘은 다음과 같은 방식으로 반복한다.

  1. gems[hi] 의 보석을 map 에 넣으면서 +1 을 해준다.
  2. 조건에 부합한지 확인을 한 후 answer 의 값을 업데이트 해준다.
  3. mapgems[lo] 에 해당하는 값을 -1을 해주는데 만약 1이면 키값을 삭제하면서 answer 값을 업데이트 해준다.
profile
알고리즘과 프론트엔드 부셔버리기

0개의 댓글