코딩가딩가

[JAVA]BOJ 1966, 프린터 큐

Noooodle 2024. 8. 19. 15:56

class를 사용한 큐 문제이다.

  1. 순서와 중요도를 가진 class를 선언하고, 그 클래스로 큐를 만든다.
  2. 첫 번째 큐의 요소보다 큰 중요도를 가진 요소가 뒤에 존재한다면 첫 번째 큐를 뒤로 보낸다. 이때 flag로 표시를 해줘서 첫 번째 큐의 요소보다 큰 중요도를 가진 요소가 뒤에 있다는 것을 표시한다.
  3. flag에 표시가 되지 않은경우는 첫 번째 큐의 요소보다 큰 중요도를 가진 요소가 없다는 것을 뜻하므로 인쇄한다.(poll())
  4. 몇 번 인쇄했는지 순서가 중요하므로 인쇄 횟수를 저장한다.
  5. (cnt) 이때 인쇄한 큐의 요소의 순서가 입력받은 M과 같으면 인쇄횟수(cnt)를 출력한다.

자세한 설명은 주석으로 표시했다.


아래는 전체 코드이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ1966 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int K, N, M, i, j, flag, cnt = 0;
        StringTokenizer st;
        Queue<Document> queue = new LinkedList<>();

        K = Integer.parseInt(br.readLine());

        for(i=0;i<K;i++){
            st = new StringTokenizer(br.readLine());
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());

            // 큐 입력 받기
            st = new StringTokenizer(br.readLine());
            for(j=0;j<N;j++){
                queue.add(new Document(j,Integer.parseInt(st.nextToken())));
            }

            // M번째 문서가 몇번째로 인쇄되는지 찾기
            while(!queue.isEmpty()){
                flag = 0;
                Document current = queue.peek();

                for(Document doc : queue){ // 뒤에 현재보다 중요도가 높은 문서가 있는지 확인
                    if(doc.getPriority() > current.getPriority()){ // 있으면 뒤로 보내기
                        flag = 1; // 중요도 높은 문서가 뒤에 있다는 표시
                        queue.add(queue.poll());
                        break;
                    }
                }
                if(flag == 0){ // 현재보다 중요도가 높은 문서가 없음
                    Document printDc = queue.poll(); // 인쇄하기
                    cnt++; // 인쇄 횟수 세기
                    if(printDc.getIndex() == M){
                        System.out.println(cnt);
                    }
                }
            }
            cnt = 0;
        }
    }
}
public class Document {
    int index;
    int priority;

    public Document(int index, int priority) {
        this.index = index;
        this.priority = priority;
    }

    public int getIndex() {
        return index;
    }

    public int getPriority() {
        return priority;
    }
}

'코딩가딩가' 카테고리의 다른 글

[JAVA]BOJ 5430, AC  (0) 2024.08.21
[JAVA]BOJ 10866, 덱  (0) 2024.08.20
[JAVA]BOJ 10845, 큐  (0) 2024.08.18
[JAVA]BOJ 2164, 카드2  (0) 2024.08.18
[JAVA]BOJ 2161, 카드1  (0) 2024.08.18