PS

[BOJ] 1966: 프린터 큐

yunny_world 2022. 6. 12. 13:24

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

 

1966번: 프린터 큐

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

www.acmicpc.net


접근 방법 / 풀이

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

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

 

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

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


시간 복잡도

최악의 경우,

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

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

==m이 될 때가 마지막 문서를 출력할 때 라고

가정해보면, 하나의 테스트케이스 당 O(9n2) 라 할 수 있다. n100 이므로 시간 안에 풀 수 있다.


코드

#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번: 체인  (1) 2022.06.23
[BOJ] 5525번: IOIOI  (0) 2022.06.15
[BOJ] 2981: 검문  (1) 2022.06.08
[BOJ] 1561번: 놀이공원  (0) 2022.06.07