알고리즘/프로그래머스
[프로그래머스] 프린터_JAVA
jimkwon
2022. 2. 11. 13:57
반응형
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42587
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다.
이 구문부터 물구나무 서고 봐도 큐에 관련된 문제임을 알 수 있다.
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;
}
}
문제를 풀 때, 해당 문제가 어떤 자료구조에 특화되어있는지를 빨리 파악하는게 중요한 것 같다.