BOJ 1966 - 프린터 큐 (C++)

채원·2023년 6월 21일
0

ps 재활 일기... (그럴 실력도 없지만) 그 두 번째 이야기

어제 못 푼 문제 결국 어찌저찌 방법 생각해서 풀었다~ 근데 실버3ㅋㅋㅋㅋㅋㅋ
그래도 못 풀었던 거 풀었고 오랜만에 실버 푼 거니까... 이렇게 조금씩 점차 늘려가도록 하자

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int t, n, m, input, cnt;
    cin >> t;

    while (t--) {
        cnt = 0;
        cin >> n >> m;
        queue<int> q;
        vector<int> v;
        for(int i = 0; i < n; i++) {
            cin >> input;
            q.push(input);
            v.push_back(input);
        }
        sort(v.begin(), v.end());

        while (true) {
            if(q.front() == v[v.size() - 1]) {
                cnt++;
                q.pop();
                v.pop_back();
                if (m == 0) {
                    break;
                }
            }
            else {
                q.push(q.front());
                q.pop();
            }
            m = (m == 0) ? q.size()-1 : m - 1;
        }       
        cout << cnt << '\n';
    }
}

기본적인 아이디어는 굉장히 간단함
문서 인풋 받을 때 그걸 큐랑 벡터에 둘 다 넣어주고 벡터는 크기 순으로 정렬하는 거
그리고 그냥 노가다 뜀...ㅋㅋ 그래서 큐 맨 앞에 있는 문서가 중요도가 가장 높아야 되니까 -> 벡터의 맨 뒤에 있어야 하니까 그 조건을 만족하면 큐에서 팝하고 벡터 팝하고 카운트 증가시키는 식
만약 조건을 만족 못하면 큐 프론트에 있는 문서를 다시 푸시해줬음. 이 과정을 계속 반복하는 와중에 또 내가 확인하고 싶은 문서!!를 추적해야 하니까 한 번 이 과정을 돌 때마다 m 값을 1씩 감소시키고, 만약 m이 0일 때는 큐의 맨 뒤로 보내줬음.
그래서 인쇄할 문서가 내가 원하는 문서일 때 -> m이 0(맨 위에 있음) 일 때 break하고 카운트를 출력하는 방식!

물론 이걸 풀면서도... 몇 가지 자잘한 실수를 했다
1. m 0일 때 m 크기를 큐 사이즈 -1로 해줘야 하는데 (인덱스가 0부터 시작해서) -1을 안해서 무한루프 돔
2. 문서 출력하고 벡터에서 팝을 안함;; 그래서 무한루프 돔 근데 이거 팝백하면 다행히 배열 크기도 줄어들더라.. (공식문서 봄) 아주 굿

아무튼 또 한 문제 풀었다 뿌듯하다~ 내일도 풀어야지~

profile
학부생

0개의 댓글