Min:D's Devlog

[프로그래머스][스택/큐][C++] 프린터 본문

알고리즘/프로그래머스

[프로그래머스][스택/큐][C++] 프린터

Min:D 2020. 10. 23. 22:50

문제

프로그래머스 스택/큐 - 프린터 (Level 2)

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 


문제 풀이

접근 방식

대기 목록의 문서의 중요도요청 문서의 위치가 주어질 때,

요청 문서가 몇 번째로 인쇄되는 지를 구하는 문제이다.

 

우선 큐에 탐색할 인덱스를 저장해주었다. (0 ~ 문서의 개수 - 1)

그 후, algorithm 헤더에 있는 max_element를 사용하여 가장 높은 우선순위를 찾아주었고,

while문에서 큐를 사용하여 우선순위에 따라 인쇄를 수행하였다.

 

큐의 front에 있는 인덱스(now)의 우선순위가 가장 높은 우선순위인 경우에는

인쇄한 문서의 개수를 의미하는 answer의 개수를 증가시켜 주었고,

now의 우선순위를 0으로 바꿔주고, 다음으로 높은 우선순위를 찾아주었다.

 

now가 찾고자 하는 문서(location)인 경우에는 바로 answer을 리턴해주었다.

그렇지 않은 경우에는 인쇄를 완료한 문서이므로 큐에서 pop 연산을 수행해주었다.

 

가장 높은 우선순위가 아닌 경우에는 now를 큐에 push 해준 뒤, pop을 수행해주었다.

 


풀이 코드 - C++

#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> priorities, int location) {
	// 큐에 인덱스 저장
	queue<int> q;
	int len = priorities.size();
	for(int i = 0; i < len; i++) {
		q.push(i);
	}
    
	// 우선순위에 따라 인쇄 수행
	int answer = 0;
	int MAX = *max_element(priorities.begin(), priorities.end());
	int now;
	while(1){
		now = q.front();
		if(priorities[now] == MAX){
			answer++;
			priorities[now] = 0;
			MAX = *max_element(priorities.begin(), priorities.end());
            
			if(now == location)
				return answer;
			else
				q.pop();
		}
		else {
			q.push(now);
			q.pop();
		}
	}
}

실행 결과

실행 결과 : 통과 (100.0)

Comments