하루에 한 문제

[프로그래머스] 프린터 -Java 본문

알고리즘/프로그래머스

[프로그래머스] 프린터 -Java

dkwjdi 2021. 2. 22. 15:02

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

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

import java.util.Collections;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;

class Solution {
	    public int solution(int[] priorities, int location) {
	        int answer = 0;
	        Queue <Integer> priority = new LinkedList<>(); //중요도
	        PriorityQueue <Integer> sortPriority = new PriorityQueue<Integer>(Collections.reverseOrder());
	        Queue <Integer> index = new LinkedList<>();    //인덱스
	        
	        for(int i=0; i<priorities.length; i++) {
	        	index.offer(i);
	        	priority.offer(priorities[i]);
	        	sortPriority.offer(priorities[i]);
	        }
	        
	        int cnt=0;
	        while(!priority.isEmpty()) {
	        	int pri=priority.poll(); //프린터 하나 뽑기
	        	int idx=index.poll();
	        	if(pri==sortPriority.peek()) { //현재 뽑는게 가장 높은 우선순위를 가진다면 
	        		cnt++;
	        		sortPriority.poll();
	        		if(idx==location) { //찾으면 
	        			answer=cnt;
	        			break;
	        		}
	        	}
	        	else { //우선순위 더 높은게 있다면 다시 넣어주기
	        		priority.offer(pri);
	        		index.offer(idx);
	        	}
	        }
	        
	        return answer;
	    }
	}

소요시간 : 15분

 

큐를 3개 사용했습니다.

1. 중요도를 저장할 큐

2. 중요도가 높은 순으로 저장되어 있는 우선순위 큐

3. 인덱스를 저장할 큐

 

로직을 살펴보면

 

1. 중요도, index를 저장하고 있는 큐에서 각각 하나씩 poll합니다.

2. 중요도 우선순위큐에서 peek을 합니다.

    2-1. 만약 중요도와 우선순위큐에서 뽑은 중요도가 같다면 우선순위큐를 poll합니다.

          그리고 프린터한 숫자를 1개 늘려줍니다.

          만약 인덱스가 location과 같다면 answer에 cnt를 넣어주고 while문을 종료합니다.

    2-2. 우선순위큐의 중요도가 더 높다면 

          중요도, index를 다시 각각의 큐에 offer해줍니다.

Comments