백준 1966 풀이
큐를 활용한 문제였다.
하지만 c++ stl에서 제공해주는 큐에서는 iterator를 지원해주지 않아 deque를 썼다.
문제를 풀 때 제일 먼저 생각한 것은 큐에서 최대 우선순위와 최소 우선순위를 찾아야한다는 것이다.
또한 큐에 저장할 때 pair(우선순위, index)형태로 저장했다.
큐를 탐색하면서 최대, 최소값을 찾았고 큐의 앞에서부터 하나씩 꺼내 이 값이 맥스면 큐에서 제외하고 count를 증가시킨다. 이후 현재 꺼낸 값의 인덱스가 찾고자하는 위치의 문서와 일치한다면 그 때까지의 count값이 정답이 된다. 일치하지 않을 경우 꺼낸 pair를 다시 큐에 집어 넣는다.
min==max은 남은 문서의 우선순위가 동일하다는 것이기때문에 위와같은 방식으로는 구하기 어렵다. 그래서 기존의 반복문을 빠져나와 남은 큐를 탐색하면서 찾는 문서와 같은 인덱스를 가진 문서가 큐에 남아있는지 검사를 하여 있다면 정답으로 한다.
#include <iostream>
#include <deque>
#include <vector>
#include <string>
#include <string.h>
#include <sstream>
#include <cstdlib>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
using namespace std;
int t;
int n;
int m;
long long arr[1001];
int findMin(deque<pair<int, int>> q) {
int min = 10;
for (int i = 0; i < q.size(); i++) {
int tmp = q.at(i).first;
if (tmp <= min) {
min = tmp;
}
}
return min;
}
int findMax(deque<pair<int, int>> q) {
int max = 0;
for (int i = 0; i < q.size(); i++) {
int tmp = q.at(i).first;
if (tmp >= max) {
max = tmp;
}
}
return max;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> t;
for (int k = 0; k < t; k++) {
deque<pair<int, int>> v;
int answer = 0;
cin >> n >> m;
for (int i = 0; i < n; i++) {
int tmp;
cin >> tmp;
pair<int, int> p(tmp, i);
v.push_back(p);
}
int min = findMin(v);
int max = findMax(v);
int count = 0;
while (true) {
if (min == max)
break;
pair<int, int> tmp = v.front();
v.pop_front();
if (tmp.first == max) {
count++;
max = findMax(v);
if (tmp.second == m) {
answer = count;
}
}
else {
v.push_back(tmp);
}
}
for (int i = 0; i < v.size(); i++) {
count++;
int tmp = v.at(i).second;
if (tmp == m) {
answer = count;
break;
}
}
cout << answer << '\n';
}
return 0;
}
Author And Source
이 문제에 관하여(백준 1966 풀이), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@estry/백준-1966-풀이저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)