[프로그래머스] 보석 쇼핑 / JavaScript / Level 3

KimYoungWoong·2022년 12월 26일
0

Programmers

목록 보기
41/60
post-thumbnail

🚩문제 주소


📄풀이

투 포인터 or Map 활용

처음엔 투 포인터 알고리즘을 활용하여 풀다가 생각보다 잘 안풀려서 구글링을 해보았습니다.
관련 글들 중에서 Map에 관련된 굉장한 풀이법들이 있어서 풀고 많이 배웠습니다.
  1. 최대 구간을 저장합니다.

  2. 보석 갯수를 Set을 활용하여 구해줍니다.

  3. gems 배열을 순회하는데 Map에 보석 이름이 이미 있다면 삭제한 뒤 인덱스를 갱신하여 저장합니다.
    계속 저장하다가 Map의 사이즈와 보석 갯수가 같아지면 Map의 처음 value+1과 현재 인덱스 +1을 하여 구간을 만들어줍니다.
    현재 구간의 차이가 처음 저장한 최대 구간의 길이의 차이보다 작다면 배열을 갱신합니다.

  4. 정답 구간을 반환합니다.



👨‍💻코드

function solution(gems) {
    let answer = [1, gems.length];
    const gemsCnt = new Set(gems).size;
    const gemsMap = new Map();
    
    gems.forEach((gem, idx)=>{
        gemsMap.delete(gem);
        gemsMap.set(gem, idx);
        if (gemsMap.size === gemsCnt) {
            const temp = [gemsMap.values().next().value+1, idx+1];
            const tempLen = temp[1] - temp[0];
            const answerLen = answer[1] - answer[0];
            if (answerLen > tempLen) answer = temp;
        }
    });
    
    return answer;
}

profile
블로그 이전했습니다!! https://highero.tistory.com

0개의 댓글