본문 바로가기

코딩테스트/c++

[백준] 1966번 프린터 큐

728x90

 

중요도가 같을 때를 구분하기 위해 문서들을 pair<int,bool>형태로 정의하여 중요도가 같은 경우 bool형이 true인 문서가 찾고자 하는 문서로 설정했다.

 

 

프린터의 가장 앞문서를 뽑아 해당 문서보다 중요도가 높은 문서가 있는지 확인한다.

1) 있을 경우

해당 문서를 큐의 가장 뒤로 보낸다.

2) 없을 경우(해당 문서의 중요도가 가장 높은 경우)

order 값을 1 더한 후(어차피 문서 하나는 결국 인쇄해야하기 때문) 해당 문서의 중요도가 인쇄하고자 하는 문서의 중요도와 일치하는지 확인한다.

   2-1) 일치하는 경우

     해당 문서의 bool값을 확인한 후 true면 order값을 출력하고 false면 numCount[해당 문서의 중요도]를 하나 빼서 인쇄한다.

   2-2) 일치하지 않는 경우

     numCount[해당 문서의 중요도]를 하나 빼서 인쇄한다.

 

 

전체 코드

#include <bits/stdc++.h>

using namespace std;



int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int n;
	cin >> n;

	while (n--) {
		int numCount[10] = { 0, };	// 해당 중요도의 문서 갯수를 저장하는 배열

		int N, M;
		cin >> N >> M;
		

		queue<pair<int,bool>> printer;	// 같은 중요도일 때 체크하기 위해 pair형으로 선언
		int order = 0;	// 답
		int key = 0;	// M번째 문서의 중요도

		for(int i=0; i < N;i++) {
			int num;	// 중요도
			cin >> num;
			if (i == M) {
				key = num;
				printer.push({ num,true });	// 인쇄하고자 하는 문서
			}
			else
				printer.push({ num,false });
			numCount[num]++;	// 중요도 갯수
		}


		while (!printer.empty()) {
			int curNum = printer.front().first;	// 중요도
			bool curNumFlag = printer.front().second;	// 해당 문서인지 확인하는 flag
			printer.pop();
			bool isMax = true;	// 해당 문서의 중요도가 제일 높은지 확인하는 flag

			for (int i = curNum+1; i < 10; i++) {	// 해당 문서보다 중요도가 높은 문서 있는지 확인
				if (numCount[i] > 0) {	// 해당 문서보다 중요도가 높은 문서 있음
					printer.push({ curNum,curNumFlag });
					isMax = false;
					break;
				}
			}
			
			if (isMax) {	// 해당 문서의 중요도가 제일 높은 경우
				order++;
				if (curNum == key) {	// 해당 문서와 인쇄하고자 하는 문서의 중요도가 같은 경우
					if (curNumFlag) {	// 해당 문서가 인쇄하고자 하는 문서인 경우
						cout << order << '\n';
						break;
					}
				}
				numCount[curNum]--;	// 인쇄
			}
		}

	}

	return 0;
}
728x90
반응형

'코딩테스트 > c++' 카테고리의 다른 글

[백준] 19699번 소-난다!  (0) 2021.11.04
[백준] 21735번 눈덩이 굴리기  (0) 2021.11.04
[프로그래머스] 오픈채팅방  (3) 2021.07.06
[백준] 3273번 두 수의 합  (2) 2021.06.30
[백준] 1406번 에디터  (0) 2021.06.29