스택 - 프린터
Updated:
C++
스택/큐 - 프린터
문제
현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.
접근 방법
각 문서의 우선 순위와, 처음 주어진 문서 들의 순서를 함께 저장하는 queue를 선언한다.
queue의 특징에 맞게 제일 앞의 문서를 꺼낸 후, 그 문서의 우선 순위가 나머지 문서들의 우선 순위보다 더 크면 인쇄를 하고, 뒤에 밀린 문서들의 우선 순위보다 작을 시에는 현재 대기 queue의 제일 뒤에 push한다.
인쇄를 하는 중 만약 그 문서의 순서가 처음 주어진 location
과 같으면 몇번째로 출력하였는지도 알린다.
구현
우선순위와 현재 순서를 pair로 묶은 후, 이를 queue를 통해 모두 저장한다.
이 queue가 empty가 될 때까지, 즉 모든 문서가 인쇄 될때까지 while문을 돌린다.
제일 앞의 문서의 우선순위와 처음 순서를 pop 한 후, 뒤의 대기 문서들의 우선순위와 다 비교한다.
queue는 순회가 되지 않으므로, 미리 size를 가지고 이 size 만큼 queue를 하나씩 뽑아 비교하고 다시 넣는 방식으로 우선 순위를 비교한다.
만약 순회 도중 우선 순위가 밀리면, isSamll
을 true로 해주어 이 문서는 프린트를 할 수 없다는 것을 명시해준다.
이후 조건문 3가지로 문서의 처우를 결정한다.
isSmall
이 true이어, 우선순위가 밀리면 기존 queue(대기 목록)의 제일 뒤에 저장한다.isSmall
이 false이며, 이는 우선순위가 제일 큰 문서라는 뜻이다. 따라서 인쇄를 하는데, 만약 이 문서의 처음 순서가 주어진 매개변수location
과 같으면 현재 출력 순서를 저장하여 결과 값을 도출해 낸다.isSmall
이 false이며, 순서가 처음 의도한 순서와 다른 경우이다. 이 경우에는 출력 순서를 증가시켜준다.
코드
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int solution(vector<int> priorities, int location) {
int answer = 0;
int order = 1;
queue<pair<int,int>> qe; //문서의 우선 순위와 초기 순서 등 정보가 들어있는 queue
for (int i = 0; i < priorities.size(); i++) {
qe.push(make_pair(priorities.at(i), i));
}
while (!qe.empty()) {
int front = qe.front().first; //제일 앞의 문서의 정보를 꺼낸다.
int curlo = qe.front().second;
qe.pop();
int size = qe.size();
bool isSmall = false;
while (size--) { //문서 대기 목록들의 정보를 비교한다.
int comp = qe.front().first;
int complo = qe.front().second;
qe.pop();
if (front < comp)
isSmall = true;
qe.push(make_pair(comp, complo));
}
if (isSmall) { //우선 순위가 밀렸을 경우
qe.push(make_pair(front, curlo));
}
else if(curlo == location){ //우선 순위가 제일 높고, 주어진 위치의 문서일 경우
answer = order;
}
else { //우선 순위가 제일 높지만, 필요한 위치의 문서가 아닌 경우
order++;
}
isSmall = false;
}
return answer;
}
후기 및 개선할 점
20분 컷.
이전 과는 다르게 pair
를 사용하여 더 간결하게, 쉽게 해결하였다.