[BOJ] 1966 "프린터 큐" 문제 풀이 & 소스 코드 With C/C++

반응형
반응형

#INFO

난이도 : SIVLER3

알고리즘 유형 : DataStructure_QUEUE

출처 : 1966번: 프린터 큐 (acmicpc.net)

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net


#SOVLE

pairqueue 의 사용법을 연습할 수 있도록 해준 좋은 문제였습니다. 3번째 테스트 케이스 [6 , 0] [1 , 1 , 9 , 1 , 1 , 1] 를 예시로 풀이 하도록 하겠습니다.

우선 queue와 pair를 이용해 각 중요도를 구별하기 위해서, 인덱스를 붙여 주었습니다. 만약 인덱스가 찾고자 하는 인덱스(M)와 동일하다면, pair.second()에 1을 찾고자 하는 인덱스가 아니라면 pair.second()에 0을 대입합니다. 

vector<int> v;
queue<pair<int,int>> q;
int cnt = 0;
cin >> N >> M;
		
for (int i = 0 ; i < N ; i++) {
	int tmp;
	cin >> tmp;
	v.push_back(tmp);
	if (i == M) { q.push({x, 1}); }
	else { q.push({x, 0}); }
}

벡터에 들어있는 중요도값을 오름차 순으로 정렬합니다.

// 중요도 순으로 오름차 정렬 
sort(v.begin(), v.end());

 

다음으로 vector와 queue를 비교해 케이스에 따라 if 분기문을 수행합니다.

case1. 본인 순서이고, 찾고자 하는 인덱스(M)인 경우

case2. 본인 순서이지만, 찾고자 하는 인덱스(M)가 아닌 경우

case3. 본인 순서가 아닌경우

 

*1 queue.front() 의 값과 vector.back() 값을 비교합니다. 중요도가 9보다 낮기에 본인 순서가 아니므로  뒤로 보내줍니다. (case3)

 

*2 마찬가지로 본인 순서가 아니므로 뒤로 보내줍니다. (case3)

 

*3 본인 순서이지만, 찾고자 하는 인덱스(M..1)이 아니므로 queue에서 pop() 해주고 vector 에서도 pop_back() 해줍니다. 다음으로 연산횟수(ans)를 1 증가시킵니다. (case2)

 

*4 마찬가지로 본인 순서이지만, 찾고자 하는 인덱스가 아니므로 case2 과정을 수행합니다.

 

*5 (앞의 두 개 인덱스는 case2 이므로 생략했습니다.) 본인 순서이고, 찾고자 하는 인덱스(queue.second()==1) 이기에 연산횟수(ans)를 1 증가시킨 후 반복문에서 break 합니다. (case1)

		int ans = 0;
		while(true){
			// 본인 순서 O 
			if (v.back() == q.front().first) {
				// 본인 순서 O 인덱스 O
				if (q.front().second == 1) {
					ans++;
					break;
				}
				// 본인 순서 O 인덱스 X
				else {
					v.pop_back();
					q.pop();
					ans++;
				}
			}
			// 본인 순서 X
			else {
				q.push({q.front().first, q.front().second});
				q.pop();
			}
		}

 

마지막으로 ans값을 출력해 주면 됩니다.

cout << ans << endl;

#CODE

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

int main(int argc, char* argv[]){
	int testCase, N, M;
	cin >> testCase;
	while(testCase--){
		vector<int> v;
		queue<pair<int,int>> q;
		cin >> N >> M;
		
		for (int i = 0 ; i < N ; i++) {
			int tmp;
			cin >> tmp;
			v.push_back(tmp);
			if (i == M) { q.push({tmp, 1}); } // check
			else { q.push({tmp, 0}); }
		}
		
		// 중요도 순으로 오름차 정렬 
		sort(v.begin(), v.end());
		
		int ans = 0;
		while(true){
			// 본인 순서 O 
			if (v.back() == q.front().first) {
				// 본인 순서 O 인덱스 O
				if (q.front().second == 1) {
					ans++;
					break;
				}
				// 본인 순서 O 인덱스 X
				else {
					v.pop_back();
					q.pop();
					ans++;
				}
			}
			// 본인 순서 X
			else {
				q.push({q.front().first, q.front().second});
				q.pop();
			}
		}
		
		cout << ans << endl;
	}
	return 0;
}


반응형

댓글

Designed by JB FACTORY