알고리즘 문제 풀기

프로그래머스: 보석 쇼핑 - javascript(슬라이딩 윈도우)

Fo_rdang 2024. 5. 7. 09:02
반응형

문제 출처 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이 힌트 

 

슬라이딩 윈도우를 이용하자. 

반복문 2개를 활용하면 되는데

- 큰 반복문 : 윈도우 사이즈를 보석 종류 개수부터 시작해서 1씩 크게 한다. 

- 그 안에 작은 반복문: 해당 윈도우 사이즈 만큼 gems를 전체 돌아다니면서 조건을 만족하는지 확인한다.

 

조건은, Set 객체를 활용한다. 

 

정답 풀이 코드 

function solution(gems) {
    let set = [...new Set(gems)]; //중복되지않은 보석 배열
    let n = set.length; //개수 
    for(let i=n; i<=gems.length; i++){ //윈도우 사이즈 1씩 늘려준다. 
        let sIdx = 0; //gems 배열을 탐색할 시작 idx 
        while(sIdx+i <= gems.length){ //sIdx도 1씩 늘려줄건데, gems의 마지막 idx까지만
            if(check(gems.slice(sIdx, sIdx+i), set)) return [sIdx+1, sIdx+i] //조건을 만족하면 해당 idx 출력
            sIdx++; //조건 만족하지 못하면 sIdx+1 로, 탐색 계속 해야함. 
        }
    }
}
//해당 배열과 set 배열을 개수를 비교하는 함수 
function check(arr,set){
        if([...new Set(arr)].length === set.length) return true; //둘다 중복되지 않은 보석 개수가 같다면 return true 
        else return false; 
    }

 

Only 풀이 코드 

function solution(gems) {
    let set = [...new Set(gems)];
    let n = set.length; 
    for(let i=n; i<=gems.length; i++){ 
        let sIdx = 0; 
        while(sIdx+i <= gems.length){
            if(check(gems.slice(sIdx, sIdx+i), set)) return [sIdx+1, sIdx+i]
            sIdx++; 
        }
    }
}

function check(arr,set){
        if([...new Set(arr)].length === set.length) return true; 
        else return false; 
    }
반응형