티스토리 뷰
[BOJ 1966(S3) 리뷰]
시뮬레이션 문제다. 설명에 나온대로 프린터 큐가 존재하고 큐에 있는 각각의 작업마다 중요도가 있다. 큐의 맨앞 작업부터 하나씩 내보내야 하는데 만약 뒤에서 기다리고 있는 작업 중 현재의 작업보다 중요도가 높은 작업이 있다면 현재의 작업을 맨 뒤로 보내고 중요도가 높은 작업먼저 수행해야 한다. 이 때 M번 작업이 몇번만에 수행이되는지를 출력해야 한다.
가장 먼저 떠올렸던 구현은 큐가 빌때까지 반복문을 돌며 계속해서 뒤에있는 큐중 중요도가 있는작업이 있는지 확인하고 있다면 현재 큐를 뒤로 보내는 작업이다. 이 작업은 시간복잡도 O(n^2)에 수행된다.
N이 100이하이므로 이 코드도 충분히 통과가 가능하지만, 나는 O(n)에 구현하기 위하여 우선순위큐를 이용했다.
우선순위큐를 이용해 중요도를 내림차순으로 정렬한 후에 큐를 돌면서 현재 작업이 우선순위큐의 top보다 낮다면 (더 높은 중요도가 존재한다는 것) 현재 작업을 뒤로밀고, 만약 현재 작업이 우선순위큐의 top과 같은값이라면 해당 작업을 pop후에 cnt를 증가시키면된다. 만약 현재 pop을 하려는 작업의 index가 M이라면 cnt값을 출력하고 종료하면 된다.
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
cin.tie(0);
ios::sync_with_stdio(0);
int tc;
cin >> tc;
while (tc--)
{
int N, M;
cin >> N >> M;
queue <pair<int,int>> printer;
priority_queue <int,vector<int>,less<int>> important;
for (int i = 0; i < N; i++)
{
int val;
cin >> val;
important.push(val);
printer.push({ i,val });
}
int cnt = 0;
while (!important.empty())
{
int top = important.top();
if (printer.front().second != top)
{
auto temp = printer.front();
printer.push({ temp.first,temp.second });
printer.pop();
}
else
{
cnt++;
if (printer.front().first == M)
{
cout << cnt<<'\n';
break;
}
printer.pop();
important.pop();
}
}
}
}
'알고리즘 풀이 > 시뮬레이션' 카테고리의 다른 글
BOJ : 14890 경사로 (0) | 2020.12.30 |
---|---|
BOJ : 14503 로봇 청소기 (0) | 2020.12.29 |
BOJ : 17140 이차원 배열과 연산 (0) | 2020.08.24 |
BOJ : 17144 미세먼지 안녕! (0) | 2020.08.22 |
BOJ : 17142 연구소 3 (0) | 2020.08.22 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백트래킹
- nodeJS
- java
- 컴퓨터 구조
- BFS
- 컴퓨터 통신
- ReactNative
- nestjs
- typeORM
- dfs
- 투포인터
- Computer Architecture
- 시뮬레이션
- 알고리즘
- 그리디
- 세그먼트 트리
- nest.js
- 백준
- 자바
- 중앙대학교
- 자바스크립트
- 재귀
- 동적계획법
- 그래프
- node.js
- 벨만포드
- boj
- 스레드
- 예외처리
- 구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함