본문 바로가기
알고리즘

[우선순위큐] 프로세스 (앞에서 빼고 뒤에 넣고)

by limew 2023. 10. 12.

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

 

  • 우선순위 높은순 실행 숫자가 큰 1-9
  • 숫자가 클수록 우선순위가 높다
  • location = index
  • queue앞에서 빼고 뒤에 넣고 순회한다
  • Math.max(...arr)
  • shift remove
  • some

첫번째 풀이(성공)

function solution(priorities, location) {
    var answer = 0;
    priorities = priorities.map((p, i) => ({priority: p, location: i}));
    
    while(priorities.length) {
        const curr = priorities.shift();
        
        // 현재보다 큰 순위가 없을 때 삭제
        if (!priorities.some(p => p.priority > curr.priority)) {
            answer++;
            if (curr.location === location) {
                return answer;
            }
        } else {
            // 현재보다 큰 순위가 있으면 뒤로 넣는다
            priorities.push(curr);
        }
    }
    return answer;
}

 

 

두번째 풀이(성공)

  • queue배열에 각 priorities의  {순위, location} 를 담는다
  • queue 앞에서부터 curr을 빼서 타겟을 찾을떄까지 순회한다
    • curr의 현재순위가 최상순위이다
      • curr을 queue에서 삭제한다
      • answer++;
      • curr의 location이 목표물이면 순회를 멈춘다
      • 최상순위의 갯수를 변경한다.
        • 최상순위가 1개면 hash에서 최상순위를 delete한다 (obj에서 key와 value삭제하기 delete hash[최상순위])
        • 2개 이상이면 -= 1
    • 최상순위가 아니면 
      • queue에서 맨 앞을 빼서 queue뒤로 넣어준다
function solution(priorities, location) {
    var answer = 0;
    const hash = {}; // {순위: 갯수} 순위비교
    priorities.forEach(p => hash[p] = (hash[p] || 0) + 1);
    const queue = priorities.map((p, i) => ({p, i})); // {p: 순위, i: location}
    let foundTarget = false;
    
    function getMaxPriority() {
        return Math.max(...Object.keys(hash));
    }
    
    //  location을 찾을때까지
    while(queue.length && !foundTarget) {
        const {p, i} = queue[0];
        // 현재순위가 최상순위일때 삭제
        if (p === getMaxPriority()) {
            // 1개 일때
            if (hash[p] === 1) {
                delete hash[p];
            } else {
                hash[p] -= 1;
            }
            answer++;
            queue.shift();
            if (i === location) foundTarget = true;
        } else {
            queue.push(queue.shift());
        }
    }
    return answer;
}