이중우선순위큐

유성재·2023년 1월 2일
0
post-custom-banner

문제

풀이

이전에 자바로 풀었던 디펜스게임에 사용된 우선순위 큐와 관련된 문제이다.

자바스크립트는 우선순위 큐를 따로 제공하지 않기 때문에 우선순위 큐를 사용하려면 직접 구현해야 하는데 너무 번거롭다는 생각이 들어 다른 방법을 선택했다.

먼저 includes를 이용해 operations의 각 요소에서 지정된 명령어가 무엇인지 파악하고 그에 따라 동작을 수행한다.

이 때 D-의 경우 최솟값을 pop으로 쉽게 삭제하기 위해 내림차순으로 정렬하고

D의 경우 최댓값을 pop으로 쉽게 삭제하기 위해 오름차순으로 정렬한 다음 pop을 사용해서 동작을 수행한다.

그 다음은 모든 동작이 끝난 queue를 정렬해주고 answer에 정답을 넣어주면 끝이다.

function solution(operations) {
    var answer = [];
    var queue = [];
    
    //opreations 분석 및 동작 수행
    for(var idx in operations){
        if(operations[idx].includes("I ")){
            //삽입
            queue.push(operations[idx].split("I ")[1])
        }else if(operations[idx].includes("D -")){
            //최솟값을 삭제하기 위해 정렬
            queue.sort((a,b)=>b-a)
            queue.pop()
        }else if(operations[idx].includes("D ")){
            //최댓값을 삭제하기 위해 정렬
            queue.sort((a,b)=>a-b)
            queue.pop()
        }
    }
    
    //내림차순 정렬 이후 정답 넣기
    queue.sort((a,b)=>b-a)
    answer = queue.length<1 ? [0,0] : [parseInt(queue[0]),parseInt(queue[queue.length-1])] 
    
    return answer;
}

이 문제도 되게 간단한 편이었는데 다른 풀이들을 보고 배운점이 몇가지 있어 가져왔다.

먼저 내가 queue에 데이터를 넣을때 queue.push(operations[idx].split("I ")[1]) 라는 코드를 써서 데이터를 넣어 string으로 들어가 마지막에 answer에 값을 넣어줄 때 Int형으로 바꿔주기 위해 parseInt를 사용했는데

queue.push(+(operations[idx].split("I ")[1]))

이렇게 앞부분에 +를 붙여주면 애초에 Int형으로 값이 들어가면서 굳이 parseInt를 사용할 필요가 없어진다.

//여기서 t는 내 코드의 operation[idx]와 같다.
var val = (t[2] === '-' ? Math.min : Math.max)(...list);
var delIndex = list.findIndex(t=> t ===  val);

이런 방식을 쓰면 굳이 정렬할 필요 없이 최솟값 최댓값을 찾을 수 있다.

profile
열정 있는 개발자
post-custom-banner

0개의 댓글