ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1966] 프린터 큐
    BOJ 2022. 1. 12. 21:02

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

     

    1966번: 프린터 큐

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

    www.acmicpc.net

    <문제>

    제목부터 프린터 '큐'이지만, 사실 큐를 안 쓰고 vector로 정렬해도 풀릴 거 같고..

    정렬로 풀리니 우선순위 큐도 가능하겠다.

     

    큐에 넣는 데이터를 pair<int, bool>로 넣어서

    int는 입력되는 우선순위를 넣고, bool에는 현재 데이터가 탐색 대상인지를 포함시켜주었다.

    우선순위의 상태를 나타내는 int[10]을 따로 저장하여, 현재 큐에 존재하는 우선순위들의 분포를 파악할 수 있게 한 뒤,

    큐에서 하나 꺼낸 뒤 현재 q.front().first가 우선순위 중 가장 높은 지를 먼저 검사한다.

    우선순위가 가장 높다면 그대로 하나 빼주면 되고, 그렇지 않다면 다시 맨뒤에 넣고를 반복하면 된다.

    q.front().second가 true인 경우에는 n-q.size()를 출력하고 다음 테스트 케이스로 넘어가면 된다.

     

    위 과정을 수행하는 도중, '현재 우선순위의 최대값'을 업데이트해줄 필요가 있는데..

    31-37번 라인이 해당 부분을 구현한 부분이 되겠다.

     

    <소스코드>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <bits/stdc++.h>
    using namespace std;
    int t, n, m, mx, p[10];
    int main(void) {
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        cin >> t;
        while (t--) {
            queue<pair<intbool>> q;
            memset(p, 0sizeof(p));
            cin >> n >> m;
            int i;
            mx = 0;
            for (i = 0; i < n; i++) {
                int x;
                cin >> x;
                p[x]++;
                mx = max(x, mx);
                bool t = (i == m);
                q.push({x, t});
            }
            int ans;
            while (!q.empty()) {
                auto cur = q.front();
                q.pop();
                if (cur.first != mx) {
                    q.push(cur);
                    continue;
                }
                p[cur.first]--;
                if (p[cur.first] == 0) {
                    while (1) {
                        mx--;
                        if (p[mx]) break;
                    }
                }
                if (cur.second == true) {
                    ans = n - q.size();
                    break;
                }
            }
            cout << ans << '\n';
        }
        return 0;
    }
    cs

     

    'BOJ' 카테고리의 다른 글

    [13015] 별 찍기 - 23  (0) 2022.01.14
    [2485] 가로수  (0) 2022.01.12
    [2805] 나무 자르기  (0) 2022.01.12
    [17141] 연구소 2  (0) 2022.01.09
    [2116] 주사위 쌓기  (0) 2022.01.09

    댓글