Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- int
- 백준
- 백트래킹
- BFS
- N과M
- stoi
- 이분탐색
- 정렬
- 프로그래머스
- 에라토스테네스의 체
- C++
- 최소공배수
- DP
- 오블완
- 문자열
- DFS
- 다이나믹프로그래밍
- 티스토리챌린지
- 우선순위큐
- vector
- 깊이우선탐색
- Sort
- 그래프
- 분할정복
- 알고리즘
- 배열
- 유클리드호제법
- Set
- map
- priority_queue
Archives
- Today
- Total
안녕 세상아,
[c++/백준] 1966 프린터 큐 본문
https://www.acmicpc.net/problem/1966
1966번: 프린터 큐
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에
www.acmicpc.net
프린트의 중요도가 큰 순서대로 출력해야하기 때문에 우선순위큐를 사용해야한다.
우선 queue의 pair를 사용하여 위치값과 중요도를 입력 받는다. 동시에 우선순위큐에 중요도를 입력 받는다.
이렇게 되면 우선순위큐에 중요도가 내림차순 형식으로 정렬된다.
내림차순으로 정렬된 우선순위큐의 top과 일반 큐의 중요도가 일치할 때와 일치하지 않을 경우를 나눈다.
일치할 때 cnt++를 하고 현재 위치값이 입력받은 m과 같으면 break를 하고 다음 case를 탐색한다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int cnt = 0;
int t, n, m, k;
cin >> t;
for (int i = 0; i < t; i++) {
cnt = 0;
cin >> n >> m;
queue<pair<int, int>> q;
priority_queue<int> pQ; //기본적으로 내림차순 정렬
for (int j = 0; j < n; j++) {
cin >> k;
q.push({ j,k });
pQ.push(k); //중요도 높은 순으로 정렬
}
while (!q.empty()) {
//위치값, 우선순위값 가져온 후 pop 수행
int index = q.front().first;
int val = q.front().second;
q.pop();
//우선순위 큐의 top과 중요도가 일치하면
if (pQ.top() == val) {
pQ.pop();
cnt++;
//현재 문서 인덱스가 입력받은 m과 같을 때
if (index == m) {
cout << cnt << endl;
break;
}
}
else
{
//q의 중요도가 높지 않으면 큐에 다시 push
q.push({ index,val });
}
}
}
return 0;
}
우선순위큐를 사용하는 것은 알았지만 큐의 pair를 사용하는지는 몰랐다. 처음에는 struct로 풀려고 했지만 답이 안나와서 큐로 품,,어렵다 진짜ㅠㅠ갈 길이 멀어요
'백준' 카테고리의 다른 글
[c++/백준] 15650 N과 M(2) (0) | 2023.05.08 |
---|---|
[c++/백준] 2606 바이러스 (1) | 2023.05.08 |
[c++/백준] 1003 피보나치 함수 (0) | 2023.05.07 |
[c++/백준] 9095 1, 2, 3 더하기 (0) | 2023.05.05 |
[c++/백준] 1929 소수 구하기 (0) | 2023.05.05 |