[C++] 프로세스 - 큐, pair, max_element

wansuper·2024년 1월 5일
0

CodingTest

목록 보기
31/34

https://school.programmers.co.kr/learn/courses/30/lessons/42587


정답코드 1

#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;
        }
    }
}

정답코드 2

#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;
}
  1. 값을 큐에 전부 복사합니다.
    • 복사할 때 {우선순위, 인덱스}를 함께 복사합니다.
  2. 1번 수행 후 priorities의 순서는 보장되지 않아도 됩니다.
    • sort함수를 사용해 큰 순서대로 정렬해줍니다.
    • 우선순위가 1,1,2라면 2,1,1이 될겁니다.
    • 인덱스 참조 변수를 둬서 0부터 시작합니다.
  3. 변수 지정
    • 우선순위 변수(mx)는 인덱스의 시작인 0부터
    • 리턴값(ret)는 1부터
  4. 저장된 큐의 원소를 탐색합니다.
    • 큐에서 원소를 하나씩 꺼냅니다.
    • 우선순위가 가장 높은 원소라면,
    • 우리가 찾고자 하는 위치라면 탐색을 멈춥니다.
    • 그렇지 않으면, 우선순위가 가장 높은 원소를 그 다음으로 높은 원소로 바꿔줍니다.
      - mx를 ++ 하면 그 다음 우선순위가 되겠죠
      - 우선순위가 높은 게 제거 되었으니, ret 또한 ++
    • 그렇지 않다면, 다시 큐에 넣습니다.
profile
🚗 Autonomous Vehicle 🖥️ Study Alone

0개의 댓글