JAVA Queue 선언
Queue<Integer>queue=new LinkedList<>();
- 해결방법
1. Modular를 이용하여 주어진 값 찾기
2. 자료구조는 Queue를 사용해서 하나씩 빼고 다음 수와 비교
public int[] solution(int[] progresses, int[] speeds) {
// 큐 생성
Queue<Integer> queue=new LinkedList<>();
for (int i=0;i<progresses.length;i++) {
int val=100-progresses[i];
int mod=val%speeds[i];
int res=val/speeds[i];
// System.out.println(mod);
// System.out.println(res);
if (mod>0) {
progresses[i]=res+1;
}
else {
progresses[i]=res;
}
queue.add(progresses[i]);
}
// System.out.println(Arrays.toString(progresses));
// System.out.println(queue.toString());
ArrayList<Integer>arrayList=new ArrayList<>();
while (!queue.isEmpty()) {
int res=queue.poll();
int time=1;
while (!queue.isEmpty()) {
int next=queue.peek();
if (res>=next) {
queue.poll();
time++;
}
else {
break;
}
}
arrayList.add(time);
}
// System.out.println(arrayList.toString());
int[] answer =new int[arrayList.size()];
for (int i=0;i<arrayList.size();i++) {
answer[i]=arrayList.get(i);
}
return answer;
}
해결방법
- 가장 앞에 있는 문서(J)를 뽑는다. -> 앞부터 순서대로 가기 때문에 Queue자료 구조를 사용하자는 것을 인식하자
- Queue에 들어가서 확인되어야 값은 2개의 인자이기 때문에 class로 만들어서 따로 분리하자
Queue<Printer> queue=new LinkedList<>(); static class Printer{ int idx; int prioirty; Printer(int idx, int priority) { this.idx; this.priority; } }
- 처음에 실패 -> 이유는 Queue에서 다음 값을 검증할때 그 큐도 while(!isEmpty())로 검증하여 실패 -> 따라서 1번만 검증하는 for Each로 변경하여 문제 풀이
static class Printer{
int idx;
int priority;
Printer(int idx, int priority) {
this.idx=idx;
this.priority=priority;
}
}
public int solution(int[] priorities, int location) {
int answer = 0;
Queue<Printer> queue=new LinkedList<>();
for (int i=0;i<priorities.length;i++) {
Printer printer=new Printer(i,priorities[i]);
queue.add(printer);
}
// System.out.println(queue.toString());
int time=1;
while (!queue.isEmpty()) {
Printer printer=queue.poll();
int idx=printer.idx;
int first_priority=printer.priority;
boolean check=true;
// 1번 문제 -> Queue가 무한히 돌면 안됨
// while (!queue.isEmpty()) {
// Printer next_printer=queue.peek();
// int next_priority=next_printer.priority;
// int next_idx=next_printer.idx;
// // 큰게 존재
// if (first_priority<next_priority) {
// queue.add(new Printer(idx,first_priority));
// check=false;
// break;
// }
// // else {
// // if (idx==location) {
// // return time;
// // }
// // time++;
// // }
// }
// -> for Each로 수정 (1번만 돌게 만든다)
for (Printer nextPrinter:queue) {
int next_priority=nextPrinter.priority;
int next_idx=nextPrinter.idx;
if (first_priority<next_priority) {
queue.add(new Printer(idx,first_priority));
check=false;
break;
}
}
// 다 돌았는데 큰게 없으면 뽑느다.
if (check) {
if (idx==location) {
return time;
}
time++;
}
}
return answer;
}