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

🤔 문제

🔗

현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로 실행되는지 return 하도록 solution 함수를 작성해주세요.

👊 풀이과정

여러 문서의 인쇄 요청이 들어간 프린터에서 문서들의 중요도 배열과 특정 문서의 위치를 매개변수로 받아 문서의 인쇄 순서를 리턴하는 메소드를 작성한다.

⭐ LinkedList

기본적으로 프린터는 FIFO(First In First Out)를 채택하고 있으므로 큐를 구현한 LinkedList를 사용하였다.

문서의 순서와 중요도를 저장하기 위해 Document 클래스를 생성하였고, Document 객체들을 큐에 담았다.

class Document {
    int location;
    int priority;
    
    Document(int location, int priority) {
        this.location=location;
        this.priority=priority;
    }
}

 

이제 큐가 빌 때까지 문서 인쇄와 필요에 따른 순서 변경을 반복한다.

타겟 문서보다 중요한 문서가 발견되면 즉시 문서를 맨 뒤로 보내고 printfalse로 변경한 후, 반복문을 빠져나온다.

// 문서들의 순서를 변경
while(!queue.isEmpty()) {
    int num=queue.peek().priority;
    boolean print=true;
    
    // 타겟 문서의 중요도를 판별
    for (Document d:queue) {
        if (num<d.priority) {
            print=false;
            queue.offer(queue.poll());
            break;
        }
    }
}

타겟 문서보다 중요한 문서가 발견되지 않는 경우, 무사히 for문을 빠져나와 if문에 들어가게 된다.

이 문서는 곧 인쇄될 예정이므로 answer에 1을 더해준다.

 

if (print) {
    answer++;
    if (queue.peek().location==location) {
        break;
    }
    else queue.poll();
}

이제 타겟 문서를 큐에서 뽑아내는데, 그 전에 타겟의 location이 매개변수로 받은 location과 일치하는지 검사한다. 만약 일치한다면 루프를 종료하고 answer를 리턴한다. 일치하지 않을 경우 다시 while문으로 돌아가 작업을 계속한다.

💻 소스코드

import Java.util.*;

class 프로그래머스_스택큐_프린터 {
    
    public static int solution(int[] priorities, int location) {
        int answer = 0;
        Queue<Document> queue=new LinkedList<>();
        
        for (int i=0;i<priorities.length;i++) {
            queue.add(new Document(i,priorities[i]));
        }
        
        while(!queue.isEmpty()) {
            int num=queue.peek().priority;
            boolean print=true;
            
            for (Document d:queue) {
                if (num<d.priority) {
                    print=false;
                    queue.offer(queue.poll());
                    break;
                }
            }

            if (print) {
                answer++;
                if (queue.peek().location==location) {
                    break;
                }
                else queue.poll();
            }
        }
        return answer;
    }
}

class Document {
    int location;
    int priority;
    
    Document(int location, int priority) {
        this.location=location;
        this.priority=priority;
    }
}