본문 바로가기
Developer/C, C++

[C++] 프로그래머스 - 프린터 (스택/큐)

by Doony 2022. 1. 2.

이번 포스팅에서는 프로그래머스 - 프린터(스택/큐)에 대해 다뤄보겠습니다.


문제 정의



접근 방법

다른 사람들의 풀이를 보면 큐를 정말 잘쓰는 것 같습니다.. 지난학기에 OS 과목을 수강하면서, 멀티 스레딩을 지원하는 IPC 통신에서 큐의 필요성에 대해 공감할 수 있었는데요! 이번에도 큐를 이용해서 코드를 짜봤습니다.


  • 현재 프린터의 MAX 값과 인덱스를 찾습니다.
  • 큐의 front 값을 보면서, 최대값과 다를 경우 pop 한 뒤, 다시 큐의 가장 뒤로 push 합니다. 큐는 FIFO 의 특성을 가지기 때문에, pop을 하면 맨 앞의 값이 떨어져나오는 구조입니다. 만약 최대값과 같다면, pop 하고 인덱스를 벡터에 저장합니다.
  • MAX 값도 수정이 필요합니다. 이미 pop이 완료된 맥스 값은 -10으로 설정하여 다시 최대값으로 선택되지 않도록 했습니다.
  • 최종적으로는 인덱스가 저장된 벡터와 location의 값을 비교하여 정답을 찾습니다.

코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <string>
#include <vector>
#include <iostream>
#include <queue>
 
using namespace std;
 
int solution(vector<int> priorities, int location) {
    int answer = 0;
    
    vector<int> p;
    
    queue<int> loc;
    for (int i=0; i<priorities.size(); i++) {
        loc.push(i);
    }
    
    
    // initialize Queue
    queue<int> q;
    for (auto z : priorities) {
        q.push(z);
    }
    
    while(q.size() > 0) {
        // find max
        int maxy = -10;
        int idx = 0;
        for (int i=0; i<priorities.size(); i++) {
            if (priorities[i]>maxy) {
                maxy = priorities[i];
                idx = i;
            }
        }
        
        
        // check if max is at front. 
        // if not, pop it and push.
        // if yes, pop it, and cnt++;
        if (q.front() == maxy) {
            q.pop();
            p.push_back(loc.front());
            loc.pop();
            // maxy is done! so change the priorities value..
            priorities[idx] = -10;
       
        } else {
            int temp = q.front();
            q.pop();
            q.push(temp);
            
            int temp2 = loc.front();
            loc.pop();
            loc.push(temp2);
            
            
        }
        
        
    }
    for (int i=0; i<p.size(); i++) {
        if (p[i] == location) {
            answer = i+1;
        }
    }
    
    
    return answer;
}
cs
___

댓글