본문 바로가기

백준/백준

[ 백준 1966 ] 프린터 큐

1. 문제 링크 https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

문제 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를

www.acmicpc.net

2. 문제 

3. 문제 요약

 N개의 문서가 우선순위 큐에 있을 때, M번째 문서의 출력순서를 찾는 문제이다.

 

4. 문제 풀이

(1) Heap ? Array

  일단 우선순위 큐라는 점에서 Heap를 사용할 지, 일반 array를 사용할지 고민을 했다.

 

Heap 을 이용한다면,

데이터들을 입력받는 대로 Heap 구조에 삽입하고, 입력이 끝나면 정렬시킨 후 탐색하는 방법을 생각했고,

 

Array반복탐색을 이용한다면,

데이터를 입력받는 대로, Max 우선순위부터 min 우선순위까지 반복적으로 탐색하는 방법을 생각했다.

 

 Heap을 만들어 정렬한 뒤, M의 순서를 찾는 방법은 O(N*logN) 의 복잡도를 갖고

 Array를 만들어 정렬한 뒤, M의 순서를 찾는 방법은 O(N * p) 의 복잡도를 갖는다. (p = 우선순위 범위) 

N <= 100, p = 9 이므로, Heap이 빠르겠다는 생각은 했지만, 

구현하기도 쉬우면서 성능에 큰 차이가 없기 때문에 Array 반복 탐색을 하기로 했다.

 

 (2) Array 탐색

 우선 두개의 Array를 바탕ㅇ로 진행한다.

 int arr[] = int[ N ]:  각 문서들의 우선순위가 담겨있는 배열

 int priority[] = int[ #중요도 ] : 해당 우선순위의 갯수

   배열내의 가장 높은 우선순위부터 시작해서,

 해당 값을 지니는 값들을 발견하면

 1. arr의 값을 0으로 만들고,

 2. priority[해당 우선도]의 숫자를 감소하고,

 3. 출력된 갯수를 증가시킨다.

반복탐색하면서 arr[M] = 0이 되면 종료.

 

5. 풀이 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void problem1966() throws Exception {
    stk = new StringTokenizer(br.readLine());
    N = Integer.parseInt(stk.nextToken());
    M = Integer.parseInt(stk.nextToken());
    page= new int[N];
    priority = new int[10];
    stk = new StringTokenizer(br.readLine());            
    for (int i = 0; i < N; i++) {
        page[i] = Integer.parseInt(stk.nextToken());
        priority[page[i]]++;
    }
    bw.write( printing()+ "\n");
}
 
Colored by Color Scripter
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void printing() {
    int count = 0;
    int highest = 9;
    for (int i = 0; page[M] != 0; i = (++i) % N) {
        for (int h = highest; priority[highest] == 0; h--) {
            highest = h;
            if (page[i] == highest) {
                priority[highest]--;
                page[i] = 0;
                count++;
            }
        }
    }
    return count;
}
Colored by Color Scripter
 

 

'백준 > 백준' 카테고리의 다른 글

[ 백준 17390 ] 이건 꼭 풀어야 해!  (0) 2019.11.18
[ 백준 9095 ] 1, 2, 3 더하기  (0) 2019.11.15
[ 백준 14648 ] 쿼리 맛보기  (0) 2019.11.06
[ 백준 11404 ] 플로이드  (0) 2019.11.05
[ 백준 4963 ] 섬의 개수  (0) 2019.11.04