문제 링크입니다 https://www.acmicpc.net/problem/1966
1966번: 프린터 큐
문제 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를
www.acmicpc.net
[소스코드]
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
// [Brute Force] 백준(1966) : 프린터 큐
#include<cstdio>
#include<queue>
using namespace std;
int tc, n, m, important[110];
// n개의 문서를 하나씩 큐에서 빼보면서 중요도를 비교해 몇 번째로
// 인쇄해야하는지 반환해주는 함수
int getResult(void) {
bool check[110] = { 0, };
queue <int> q;
for (int i = 0; i < n; i++) q.push(i); // n개의 문서를 큐에 넣고
int cnt = 0;
while (1) {
int max_ = 0, idx = 0;
// 아직 인쇄되지 않았고 가장 중요도가 높은 문서를 찾는다
for (int i = 0; i < n; i++) {
if (!check[i] && max_ < important[i]) {
max_ = important[i];
idx = i;
}
}
while (1) {
int cur = q.front();
// 현재 내가 큐에서 뽑은 문서가 지금 인쇄해야 하는 문서이거나
// 인쇄해야 하는 문서와 중요도가 같다면 인쇄하고 break
if (cur == idx || important[cur] == important[idx]) {
cnt++;
q.pop();
check[idx] = true;
if (cur == m) {
return cnt;
}
break;
}
else {
// 그렇지 않으면 큐에서 빼고 맨 뒤로 push
q.pop();
q.push(cur);
}
}
}
}
int main(void) {
scanf("%d", &tc);
for (int t = 1; t <= tc; t++) {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%d", &important[i]);
}
printf("%d\n", getResult());
}
return 0;
}
|
cs |

'알고리즘 > BaekJoon' 카테고리의 다른 글
백준 11403 : 경로 찾기 (0) | 2020.02.19 |
---|---|
백준 1260 : DFS와 BFS (0) | 2020.02.19 |
백준 14500 : 테트로미노 (0) | 2020.02.18 |
백준 14889 : 스타트와 링크 (0) | 2020.02.18 |
백준 16234 : 인구 이동 (0) | 2020.02.18 |