어제의 나보다 성장한 오늘의 나

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

알고리즘/프로그래머스(Programmers)

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

NineOne 2020. 12. 16. 16:53

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

문제풀이

대기목록 부분에서 바로 Queue를 써야겠다는 생각을 하였고, 중요도 부분에서 우선순위 큐가 생각이 났다.

우선순위 큐 하나로 처리할 수 없을까? 했지만 복잡하게 생각하지 않고 바로바로 생각나는데로 풀자!

그래서 중요도를 관리하는 우선순위 큐와 대기목록을 관리하는 큐를 두가지를 선언하여 처리하였다.

  1. 우선순위큐에서 가장 높은 우선순위 (target)를 꺼낸다.
  2. 대기목록에서 하나씩 꺼내면서 target과 poll()한 큐(check)의 중요도를 검사해서 같다면 인쇄해야 되기때문에
    순서를 나타내는 answer를 증가시켜준다
  3. 추가로 자리까지 같다면 원하는 값이기 때문에 전체 반복문을 빠져나간다.
  4. 2번 조건문이 같지 않다면 대기목록 뒤로 보내고 2번부터 반복한다.

코드

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

class Solution {
    public int solution(int[] priorities, int location) {
        int answer = 0;
        
        //우선 순위가 가장 높은 값을 꺼내기 위해
        PriorityQueue<Data> pq = new PriorityQueue<Data>();
        //인쇄 대기목록 저장
        Queue<Data> qu = new LinkedList<>();
        
        for(int i=0; i<priorities.length; i++){
            qu.offer(new Data(i, priorities[i]));
            pq.offer(new Data(i, priorities[i]));
        }
        
        loop:
        while(true){
            //우선순위 높은 값 저장
            Data target = pq.poll();
            
            //우선순위와 같은 값 찾기
            while(true){
                Data check = qu.poll();
                if(check.priority == target.priority){
                    answer++;
                    if(check.index == location) break loop;
                    break;
                }else{
                    qu.offer(new Data(check.index, check.priority));
                }
            }
        }

        return answer;
    }
    
    static class Data implements Comparable<Data>{
        int index;
        int priority;
        
        public Data(int index, int priority){
            this.index = index;
            this.priority = priority;
        }
        
        @Override
        public int compareTo(Data o) {
			return (this.priority - o.priority) *-1;
		}
    }
}
Comments