GGym's Practice Notes

프로그래머스 Level2_ 프린터 (C++) 본문

Algorithm

프로그래머스 Level2_ 프린터 (C++)

GGym_ 2020. 10. 31. 07:01

큐와 우선순위 큐를 사용했다.

우선순위가 9~1까지 밖에 없는 걸 생각해 9~1 순으로 우선순위 큐에서 나온 갯수만큼 저장하고 큐를 돌면서 출력하도록 하였다. 그리고 역시나 백준에 좀더 어려운 버전의 똑같은 문제가 존재했다..

[BOJ 1966 프린터 큐] : www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

첫 줄에 test case의 수가 주어진다. 각 test case에 대해서 문서의 수 N(100이하)와 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue의 어떤 위치에 있는지를 알려주는 M(0이상 N미만)이 주어진다. 다음

www.acmicpc.net

3년전에 문제를 풀어서 어떻게 풀었는지는 기억나지 않지만 queue 자료구조를 사용하지 않고 구현했었다.


프로그래머스 코드 :

#include <string>	// Level2_ 프린터 [큐]
#include <vector>
#include <queue>

#include <iostream>
using namespace std;
#define pii pair<int, int>

int solution(vector<int> priorities, int location) {
    int answer = 1;
	priority_queue<int> pq;
	queue<pii> q;
	for(int i=0; i<priorities.size();i++){
		pq.push(priorities[i]);
		q.push(make_pair(priorities[i], i));
	}

	for(int i=9; i>=1; i--){
		int j=0;
		while(pq.top() == i){
			j++;
			pq.pop();
			if(pq.empty()) break;
		}

		for(int k=0; k<j; ){
			pii s = q.front();
			if(s.first != i) q.push(s);
			else {
				if(s.second == location) return answer;
				answer++;
				k++;
			}
			q.pop();
		}
	}

	return answer;
}

// IO
int main(){
	int n, location;
	cin >> n >> location;

	vector<int> priorities;
	for (int i=0; i<n; i++){
		int k;
		cin >> k;
		priorities.push_back(k);
	}	

	cout << solution(priorities, location);
	
	return 0;
}

 

 

백준 코드 : 

#include<cstdio>
using namespace std;

int main(){
	int queue[102][2];
	int t;
	for(scanf("%d",&t);t--;){
		int n,m;
		scanf("%d%d",&n,&m);
		int i;
		for(i=0;i<n;i++) {
			scanf("%d",&queue[i][0]);
			queue[i][1]=i;
		}
		int s=0;
		while(1){
			for(i=1;i<n;i++)
				if(queue[0][0]<queue[i][0])break;
			if(i!=n){
				queue[n][0]=queue[0][0];
				queue[n][1]=queue[0][1];
			}
			else{
				s++;
				n--;
				if(queue[0][1]==m)break;
			}
			for(i=0;i<n;i++){
				queue[i][0]=queue[i+1][0];
				queue[i][1]=queue[i+1][1];
			}
		}
		printf("%d\n",s);
	}
}