티스토리 뷰

문제 링크

프린터

문제 조건

  • 중요도가 높은 문서를 먼저 인쇄하는 프린터를 만들어보자.
    1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼낸다.
    2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣는다.
    3. 그렇지 않으면 J를 인쇄한다.
  • 현재 대기목록에는 1 ~ 100개의 문서가 있다.
  • 인쇄 작업의 중요도는 1 ~ 9로 표현하며 숫자가 클수록 중요하다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현한다.

변수 설명

  • priorities : 현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 (매개변수)

  • location 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 변수 (매개변수)

  • Print : idx(index)와 prior(우선순위)를 갖는 Class

  • q : Print를 가지는 큐

  • aq : 정답 순서를 가지는 큐

  • pq : 우선순위를 기준으로 내림차순 우선순위 큐

코드 설명

  • priorities를 index와 값을 가지는 class, Print를 q에 넣어준다.
  • priorities를 pq에 넣어준다.
  • pq와 q의 prior값을 조사한다.
    • 맞으면 q.peek() 값을 aq에 넣어준다.
    • 다르면 q.peek() 값을 다시 q에 넣어준다.

배운 점

  • PriorityQueue pq = new PriorityQueue<>(ln, Collections.reverseOrder());
    • Collections.reverseOrder를 사용하여 내림차순으로 바꿀 수 있다.

문제 해답


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

class Print implements Comparable<Print> {
    int idx;
    int prior;

    Print(int idx, int prior){
        this.idx = idx;
        this.prior = prior;
    }

    @Override
    public int compareTo(Print o) {
        if(this.prior > o.prior)
            return 1;
        else
            return -1;
    }
}
class Solution {
    public int solution(int[] priorities, int location) {
        int ln = priorities.length;
        int answer = 0;
        Queue<Print> q = new LinkedList<>();
        Queue<Print> aq = new LinkedList<>();
        PriorityQueue<Integer> pq = new PriorityQueue<>(ln, Collections.reverseOrder());
        for(int i=0;i<ln;i++) {
            Print data = new Print(i, priorities[i]);
            q.add(data);
            pq.add(priorities[i]);
        }
/*        q.forEach(a -> {
            System.out.println(a.idx);
        });
        pq.forEach(a -> {
            System.out.println(a);
        });
  */
        while(!pq.isEmpty()){
            if(q.peek().prior ==pq.peek()) {
                pq.remove();
                Print buffer = q.poll();
                aq.add(buffer);
            }
            else {
                Print buffer = q.poll();
                q.add(buffer);
            }
        }
/*        aq.forEach(a -> {
            System.out.println(a.idx);
        });*/
        for(int i=1;i<=ln;i++){
            if(aq.poll().idx == location){
                answer = i;
                break;
            }

        }
        return answer;
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함