PS

[BOJ] 1966: 프린터 큐

yunny_world 2022. 6. 12. 13:24

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

 

1966번: 프린터 큐

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

www.acmicpc.net


접근 방법 / 풀이

현재 문서보다 중요도가 높은 문서의 유무의 따라 해야하는 행동이 다르므로, 현재 문서보다 중요도가 높은 문서의 유무를 판단하기 위해imp 1차원 배열을 만들어 처리했다. 왜냐하면 \( 1 \leq 중요도 \leq 9 \) 이기 때문이다.

구체적으로 현재 문서보다 중요도가 높은 문서의 유무를 살필 때에는,  \( O(9) \)의 완전탐색을 해주면 된다. 

 

입력을 받을 때 {중요도, 인덱스} 쌍으로 큐에 넣어놓고, 큐의 앞에서 하나씩 꺼내면서 필요한 행동을 하면 된다.

이런 행동들을 반복하다가 \( 인덱스==m \) 인 경우에 답을 출력하고 종료하면 된다.


시간 복잡도

최악의 경우,

인쇄할 문서가 매번 큐의 가장 뒤에 있고,

중요도도 매번 9번 검사해야 하고,

\( 인덱스==m \)이 될 때가 마지막 문서를 출력할 때 라고

가정해보면, 하나의 테스트케이스 당 \( O(9*n^2) \) 라 할 수 있다. \( n \leq 100 \) 이므로 시간 안에 풀 수 있다.


코드

#include <bits/stdc++.h>
#define ll long long int
#define pll pair<ll, ll>
#define pii pair<int, int>
#define X first
#define Y second
using namespace std;
int dx[]={-1, 1, 0, 0};
int dy[]={0, 0, -1, 1};
void solve()
{
    int imp[10]={0};
    queue<pii> q;
    int n, m; cin>>n>>m;
    for(int i=0;i<n;i++) 
    {
        int x; cin>>x;
        q.push({x, i});
        imp[x]++;
    }
    int ans=0;
    while(1)
    {
        pii now=q.front();
        q.pop();
        bool flag=false;
        for(int i=now.X+1;i<=9;i++)
            if(imp[i]>0)
            {
                flag=true;
                break;
            }
        if(flag) q.push(now);
        else
        {
            imp[now.X]--;
            ans++;
            if(now.Y==m)
            {
                cout<<ans<<'\n';
                break;
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(0); cin.tie(0);
    int tc=1; cin>>tc;
    while(tc--) solve();
    return 0;
}

테스트케이스 형식의 문제이므로 큐와 imp배열 초기화 하는 것을 까먹지 말고 실수하지 말자. 처음에 초기화를 안해줘서 값이 이상하게 나왔었다.

'PS' 카테고리의 다른 글

PS 환경 설정 글 모음  (0) 2022.07.23
[BOJ] 2785번: 체인  (0) 2022.06.23
[BOJ] 5525번: IOIOI  (0) 2022.06.15
[BOJ] 2981: 검문  (1) 2022.06.08
[BOJ] 1561번: 놀이공원  (0) 2022.06.07