알고리즘/프로그래머스

[프로그래머스] 프린터_JAVA

jimkwon 2022. 2. 11. 13:57
반응형

문제 링크

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

 

코딩테스트 연습 - 프린터

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

programmers.co.kr

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다.

이 구문부터 물구나무 서고 봐도 큐에 관련된 문제임을 알 수 있다. 

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.

 

문서의 우선순위에 따라 큐 뒤에 배치할 일이 생기기 때문에 문서의 순서를 알기 위해

큐에는 문서의 index값으로 집어넣는다.

 

1. peek()함수를 통해 대기목록 가장 앞 문서를 꺼내온다.

2. findMax()함수를 이용하여 현재 문서가 가장 중요도가 높지 않다면 다시 해당 큐 마지막에 집어넣는다 (add)

3. 가장 중요도가 높을 경우 ArrayList에 집어넣는다.

 

해당 로직을 큐가 전부 비워질때까지 진행한 후, 반환값에 ArrayList값을 넣어 제출한다.

 

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public boolean findMax(Queue<Integer> queue, int[] p) {
        Queue<Integer> temp = new LinkedList<>();;
        temp.addAll(queue);
        int max = p[temp.poll()];
        while(temp.isEmpty() != true) {
            if (p[temp.peek()] > max) 
                return false;
            temp.poll();
        }
        return true;
    }
    public int solution(int[] priorities, int location) {
        int answer = 0;
        ArrayList<Integer> index = new ArrayList<>();
        Queue<Integer> queue = new LinkedList<>();
        
        for (int i = 0; i < priorities.length; i++) {
            queue.add(i);
        }
        
        while(queue.isEmpty() != true) {
            if (findMax(queue, priorities) == true)
                index.add(queue.poll());
            else {
                queue.add(queue.poll()); 
            }
        }
        for (int i = 0; i < index.size(); i++) {
            if (location == index.get(i))
                answer = i + 1;
        }
        return answer;
    }
}

문제를 풀 때, 해당 문제가 어떤 자료구조에 특화되어있는지를 빨리 파악하는게 중요한 것 같다.