알고리즘

[BOJ] 1966 프린터 큐

졔졔311 2023. 5. 25. 17:31
728x90
반응형

https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net

---------------------------------------------------핵심 알고리즘--------------------------------------------

 

queue

 

---------------------------------------------------풀이----------------------------------------------------

 

우선, importance[]에 각 프린트물의 중요도의 개수를 저장한다.

예를 들어, 1 1 1 3 4 이면, importance[1] = 3, importance[3] = 1, importance[4] = 1 이다.

 

큐에 각 프린트물을 순서대로 저장한다.

원래의 인덱스와 프린트물의 중요도를 pair로 함께 저장한다.

 

문제 조건에 맞게 원하는 인덱스(M)이 출력될 때까지 반복한다.

queue의 front의 중요도보다 큰 프린트물이 뒤에 존재하면, 즉, importance[front 중요도보다 큰 수] > 0 이면 뒤로 push한다.

없다면 pop하는데, importance[front 중요도]를 1 감소시키고, 그 프린트물이 M이면 종료한다.

#define FASTIO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

int main(void){
    FASTIO;
    int T;
    cin >> T;
    for(int t = 0; t < T; t++){
        int N, M;
        cin >> N >> M;
        // 각 중요도 개수를 저장
        int importance[10] = {0, };
        // 인덱스, 중요도
        queue<pair<int,int> > q;
        pair<int,int> p;
        for(int i = 0; i < N; i++){
            cin >> p.second;
            p.first = i;
            q.push(p);
            importance[p.second]++;
        }
        int turn = 0;
        while(!q.empty()){
            bool print_flag = true;
            for(int i = 9; i > q.front().second; i--){
                if(importance[i] > 0){
                    print_flag = false;
                    break;
                }
            }
            if(print_flag){
                turn++;
                if(q.front().first == M){
                    break;
                }
                importance[q.front().second]--;
                q.pop();
            }
            else{
                q.push(q.front());
                q.pop();
            }
        }
        cout << turn << "\n";
    }
    return 0;
}

 

---------------------------------------------------후기----------------------------------------------------

 

priority queue로 우선순위에 따라 출력하는걸 먼저 생각했지만,

그런 방식으로는 동일한 우선순위의 프린트물에 대해강제로 우선순위가 부여되기 때문에

상황에 따라 변화하도록 해야하는 방식인 이 문제와는 맞지 않을 거라고 생각했다.

728x90
반응형

'알고리즘' 카테고리의 다른 글

[BOJ] 4949 균형잡힌 세상  (1) 2023.05.26
[BOJ] 2108 통계학  (1) 2023.05.25
[BOJ] 1929 소수 구하기  (3) 2023.05.25
[BOJ] 10814 나이순 정렬  (0) 2023.05.24
[BOJ] 2798 블랙잭  (0) 2023.05.24