🤔 문제
🔗
현재 실행 대기 큐(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;
}
}
이제 큐가 빌 때까지 문서 인쇄와 필요에 따른 순서 변경을 반복한다.
타겟 문서보다 중요한 문서가 발견되면 즉시 문서를 맨 뒤로 보내고 print를 false로 변경한 후, 반복문을 빠져나온다.
// 문서들의 순서를 변경
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;
}
}