<문제>
https://www.acmicpc.net/problem/1966
1966번: 프린터 큐
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에
www.acmicpc.net
처음에 문제를 어떻게 접근해야 할 지 고민이 많았다.
배열로 접근하자니 너무 복잡해질 것 같았고, 큐를 사용하고자 하니 (순서, 중요도) 라는 2개의 값을
어떻게 넣어야할지 몰라 막막했다. 큐에 대한 이해가 많이 부족해서 이 문제가
나에게 어려웠던 것 같다. 여러 블로그를 찾아보다가, 내 기준에서 가장 이해가 잘 됐던
블로그를 운 좋게 찾아서 문제를 해결할 수 있었다.
감사합니다 정말로,, 🫶🏻
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
//프린터 큐
class Printer {
int sequence; //순서
int importance; //중요도
Printer(int sequence, int importance){
this.sequence=sequence;
this.importance=importance;
}
}
public class P1966 {
//몇 번째로 출력되는지 계산하는 함수
static int solution(Queue<Printer> q, PriorityQueue<Integer> pq, int m) {
int count=1;
while(true) {
while(pq.peek()!=q.peek().importance) {
q.offer(q.poll());
}
if(q.peek().sequence==m) {
break;
}
q.poll();
pq.poll();
count++;
}
return count;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int test_case=Integer.parseInt(br.readLine());
for(int i=0;i<test_case;i++) {
st=new StringTokenizer(br.readLine());
int n=Integer.parseInt(st.nextToken()); //문서의 개수
int m=Integer.parseInt(st.nextToken()); //궁금한 문서가 현재 몇 번째에 놓여있는지
Queue<Printer> q=new LinkedList<>(); // 큐 생성
//우선순위큐 내림차순 정렬
PriorityQueue<Integer> pq= new PriorityQueue<>(Comparator.reverseOrder());
st=new StringTokenizer(br.readLine());
for(int j=0;j<n;j++) { //문서의 중요도
int importance=Integer.parseInt(st.nextToken());
q.offer(new Printer(j,importance)); //큐에는 Printer 객체(순서, 중요도) 를 저장
pq.offer(importance); //우선순위큐에는 중요도만 저장
}
System.out.println(solution(q,pq,m));
}
}
}
✏️풀이 방법
큐와 우선순위 큐를 사용하여 문제를 해결했다.
- 큐: Printer 클래스를 정의하여 Printer(순서, 중요도) 객체를 큐에 넣음
- 우선순위큐: 중요도만 우선순위 큐에 저장 (내림차순)
ex ) n= 6, m=0
중요도: 1 1 9 1 1 1 일 때
1. 우선순위 큐의 맨 앞에 있는 수와 큐의 중요도를 비교
2. 같지 않으면, 그 값을 큐에서 빼서 다시 큐에 넣음
=> 우선순위 큐의 맨 앞 숫자 == 첫번째 큐의 중요도가 될 때까지 이 과정을 반복
3. 이렇게 중요도대로 큐가 제대로 정렬이 되고 난 후에,
큐와 우선순위큐에서 값을 빼면서 count 를 증가시킨다.
4. 몇 번째로 출력되는지 궁금한 문서의 번호(m)과 큐에 들어있는
Print 객체의 sequence 값이 같아지면 반복문을 종료하고 count를 출력한다.
✏️ 느낀점
실버 3 문제인데, 큐와 우선순위큐 사용법을 잘 알지 못해서 어려웠다.
이번 기회를 통해 큐에 대해 좀 더 알게 된 것 같다.
다음에 비슷한 문제가 나오면 쉽게 풀 수 있도록 완전 내 것으로 만들어야겠다.
참고 블로그
'코딩테스트 > Baekjoon' 카테고리의 다른 글
[JAVA] 백준 2798번: 블랙잭 (0) | 2024.03.19 |
---|---|
[JAVA] 백준 18429번: 근손실 (1) | 2024.03.11 |
[JAVA] 백준 1212번: 8진수 2진수 (0) | 2024.01.11 |
[JAVA] 백준 1075번: 나누기 (2) | 2024.01.09 |
[JAVA] 백준 1032번: 명령 프롬프트 (1) | 2024.01.08 |