프로그래머스 : 이중우선순위큐

KHW·2021년 5월 3일
0

알고리즘

목록 보기
23/37

문제
100/100 (30분소요)

기본적인 내용

명령어수신 탑(높이)
I 숫자큐에 주어진 숫자를 삽입합니다.
D 1큐에서 최댓값을 삭제합니다.
D -1큐에서 최솟값을 삭제합니다.

모든 연산을 처리한 후 큐가 비어있으면 [0,0]
비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.

주어진 배열을 문자와 숫자를 분리 한 후 push pop을 통해서 처리


성공한 수정 전 코드

function solution(operations) {
    var answer = [];
    let splitOperation = [];
    splitOperation = operations.map(x=>({tag : x.split(' ')[0] , value : Number(x.split(' ')[1])}))
    splitOperation.map(x=>{
        if(x.tag == 'I')
            answer.push(x.value);
        else if(x.tag == 'D' && x.value == 1)     //최대값 삭제
            answer.splice(answer.indexOf(Math.max(...answer)),1);
        else                                     //최솟값 삭제
            answer.splice(answer.indexOf(Math.min(...answer)),1);
    })
    if(answer.length == 0 )
        return [0,0]
    else 
        return [Math.max(...answer),Math.min(...answer)]

}

코드내용 설명

map함수를 통해 { } 형태로 tag에는 D,I를 구분하는 역할과 value에는 값이 Number로 변환되어 숫자형태로 처리되게 배열을 만든 후
다시 map을 이용하여 문자를 확인하여 삽입인지 삭제인지 처리하는 if else문을 이용하고
이것이 끝난 후 answer의 값이 없을경우와 존재할 경우 최댓값 최솟값을 찾아낸다.

{ } 형태는 배열에 객체넣기를 통해 확인 할 수 있다.


배열에서 최대값/최솟값 제거하기

answer.splice(answer.indexOf(Math.max(...answer)),1);
answer.splice(answer.indexOf(Math.min(...answer)),1);

찾아낸 최대값(max)이 존재하는 인덱스번호(indexOf)의 한개만 제거하는(splice~,1) 역할을 한다. (최솟값도 마찬가지


수정 후 코드1

function solution(operations) {
    var answer = [];
    
    operations.map(x=>({tag : x.split(' ')[0] , value : Number(x.split(' ')[1])})).map(x=>{
        if(x.tag == 'I')
            answer.push(x.value);
        else if(x.tag == 'D' && x.value == 1)     //최대값 삭제
            answer.splice(answer.indexOf(Math.max(...answer)),1);
        else                                     //최솟값 삭제
            answer.splice(answer.indexOf(Math.min(...answer)),1);
    })
    
    return answer.length == 0  ? [0,0] : [Math.max(...answer),Math.min(...answer)]
}

필요없는 변수 제거 및 map을 통해 바로 처리
if문을 삼항연산자로 마지막에 처리


수정 후 코드2

function solution(operations) {
    var answer = [];
    
    let a = operations.map(x=>({tag : x.split(' ')[0] , value : Number(x.split(' ')[1])})).map(x=>     {
        if(x.tag === 'I')
            answer.push(x.value);
        else if(x.tag === 'D' && x.value === 1)     //최대값 삭제
            answer.splice(answer.indexOf(Math.max(...answer)),1);
        else                                     //최솟값 삭제
            answer.splice(answer.indexOf(Math.min(...answer)),1);
    })

    return answer.length === 0  ? [0,0] : [Math.max(...answer),Math.min(...answer)]
}

=====로 변환


Math.min(...arr,null) vs Math.min(...arr)

    console.log(Math.max(...[-1,-5]))
    console.log(Math.max(...[-1,-5],null))
    console.log(Math.max(...[-1,-1],null))
    console.log(Math.min(...[10,4]))
    console.log(Math.min(...[10,4],null))
    console.log(Math.min(...[1,1],null))

결과
-1
0
0
4
0
0

즉, null을 넣었을때 중복되거나 문제가 발생하는 부분이 생기므로 가능하면 null은 안쓰도록하자

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글