https://school.programmers.co.kr/learn/courses/30/lessons/42587
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int solution(vector<int> priorities, int location) {
queue<int> printer;
vector<int> sorted; // 정렬된 결과 저장용
// 큐로 생성한 printer에 index를 0부터 순서대로 넣음
for (int i = 0; i < priorities.size(); i++) {
printer.push(i);
}
while (!printer.empty()) {
// 큐의 가장 상단의 index 비교용 변수
int now_index = printer.front();
printer.pop();
// priorities의 현재 index가 최댓값과 다르면 조건 만족
if (priorities[now_index] != *max_element(priorities.begin(),priorities.end())) {
// 최댓값이 아닌 경우 push로 다시 넣음
printer.push(now_index);
} else {
// 최댓값이 맞는 경우
sorted.push_back(now_index); // 미리 선언한 sorted 벡터에 해당 인덱스 넣기
priorities[now_index] = 0; // priorities의 now_index번째 원소 0으로 초기화해둠. 이미 썼으니까!
}
}
// while 문이 끝나면 printer 큐는 사이즈가 0인 상태가 됨
// sorted 벡터에서 원소로 들어간 것은 index 정보임.
// 따라서, location과 같은 값의 원소는 등수니까 1을 더해!
for (int i = 0; i < sorted.size(); i++) {
if(sorted[i] == location) {
return i+1;
}
}
}
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
// #include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>; // using으로 pii에 int형 쌍을 저장
int solution(vector<int> priorities, int location) {
queue<pii> q; // 원형: queue<pair<int, int>> q;
// int형 쌍에 priorities의 원소와 해당 index를 순서대로 넣는다.
for(int i=0; i<priorities.size(); i++) {
q.push({priorities[i], i});
}
// greator<> 를 이용해서 priorities의 처음부터 끝까지 내림차순으로 정렬한다.
sort(priorities.begin(), priorities.end(), greater<>());
int answer = 1; // answer = 1로 초기화한 이유 : 첫번째는 1등이지 0등이 아니니까!
int mx = 0; // 우선순위 변수
// q를 기준으로 while 문 반복 - 문제 설명에 나온 프로세스(1~3.1) 그대로 따름
while(!q.empty()) {
// [스택, 큐에 많이 보이는 구조!]
// cur에 내림차순으로 정렬된 현재 큐의 가장 앞에 위치한 값 저장하고 pop()으로 빼는 구조
pii cur = q.front(); // 원형: pair<int, int> cur = q.front();
q.pop();
// cur.first는 한 쌍 중 왼쪽인 priorities[i]을 의미. 오른쪽은 cur.second = i
// 우선순위가 가장 높은 mx번째 원소와 같으면
if(cur.first == priorities[mx]) {
// 우선순위가 가장 높은 mx번째 원소의 기존 index가 location 값과 같으면
// 내림차순으로 정렬한 것에서 index도 같은거니까 완전 일치 - index 늘리지 않고 다음 연산 수행
if(cur.second == location) {
break;
}
mx++; // 중복된 원소를 찾았지만 index가 달라서 1씩 증가
answer++; // 위에서 pop한 놈의 등수에서 다음 등수로 업데이트 해야함
}
else q.push(cur); // 중복되지도 않고 다른 값이다? 큐는 정렬되지 않은 초기 상태이므로 현재 값 cur보다
// 우선순위가 더 높은 값이 있을 수 있음. 고로 다시 큐에 넣어줘. (프로세스 충실히 따름!)
}
return answer;
}