Dolphins의 HelloWorld

[백준]Baekjoon1966(Queue) 본문

Algorithm/baekjoon문제풀이

[백준]Baekjoon1966(Queue)

돌핀's 2018. 6. 28. 11:12

위의 문제를 해결하기 위해서 나는 priority_queue(우선순위 큐)와 queue를 동시에 사용했다.


priority_queue를 사용하면 가장 기본적인 포맷으로 사용했을 때 저절로 내림차순으로 큐안에서 정렬이 된다.


그래서 queue에서 가장 큰 수를 찾기위해서 priority_queue를 따로 사용하였다.


또한 queue에는 두개의 값을 동시에 넣는 pair를 이용해 문서의 위치와 문서의 중요도를 동시에 삽입하였다.


priority_queue를 이용해 큐에서 가장 큰 값을 찾고 queue의 가장 앞에 있는 값과 비교를 하면서 문제를 풀어나갔다.


자세한 것은 아래의 코드와 주석을 통해서 이해하자.




#include <iostream>
#include <string>
#include <queue>

using namespace std;

int main()
{
	int testcase;
	int M, N;
	int num; //받은 문서
	scanf("%d", &testcase); //testcase 입력

	while (testcase--) {
		priority_queue<int> pq; queue<pair<int, int>> q; //우선순위 큐와 큐 선언
		scanf("%d %d", &N, &M); //N은 문서의 수, M은 몇번째로 인쇄되었는지 궁금한 문서의 위치
		for (int i = 0; i < N; i++) { //N개 만큼 문서받기
			scanf("%d", &num);
			pq.push(num); //우선순위 큐에 삽입
			q.push(make_pair(i, num)); //큐안에 들어간 문서의 자리와 문서 삽입.
		}
		int count = 1; //매번 count는 1로 초기화
		while (1) {
			int key = pq.top(); //우선순위 큐의 맨 앞에 있는것(가장 큰 수)를 변수에 저장;

			if (key == q.front().second) { //큐의 맨앞에 있는수가 가장 큰 수 일때
				if (q.front().first == M) { //문서의 위치가 M과 일치한다면
					printf("%d\n", count); //count 출력 후 break
					break;
				}
				else { //큐의 맨앞에 있는수가 가장 큰 수이지만 원하는 위치에 있던 수가 아닐 떄
					q.pop(); pq.pop(); count++; //큐와 우선순위 큐에서 맨앞의 값을 제거해주고 count값 증가.
				}
			}
			else { //큐의 맨앞에 있는 수가 가장 큰 수가 아닐 때.
				q.push(q.front()); //맨 앞에 있는 값을 큐의 맨 뒤에 삽입.
				q.pop(); //맨 앞에 있는 값 제거
			}
		}
	}
}

'Algorithm > baekjoon문제풀이' 카테고리의 다른 글

[백준]Baekjoon1076(map)  (0) 2018.07.01
[백준]Baekjoon10866(Deque)  (0) 2018.06.28
[백준]Baekjoon10845(Queue)  (0) 2018.06.26
[백준]Baekjoon10828(스택)  (0) 2018.06.26
[백준]Baekjoon10823(String 활용)  (0) 2018.06.25
Comments