[백준] 1966번 프린터 큐

2024. 12. 31. 15:04·백준 문제/자료구조

문제: 1966번: 프린터 큐

 

#include <iostream>
#include <vector>
#include <queue>
#include <stack>

using namespace std;

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

    int t;
    cin >> t;
    while (t-- > 0) {
        int n, m; // 문서의 개수, 궁금한 문서의 현재 위치(인덱스)
        cin >> n >> m;

        // first: 인덱스, second: 중요도
        deque<pair<int, int>> docs;
        priority_queue<int> importances; // 중요도를 최대힙으로 관리

        for (int i = 0; i < n; i++) {
            int importance;
            cin >> importance;

            docs.push_back(make_pair(i, importance));
            importances.push(importance);
        }

        int cnt = 1;
        while (true) {
            int top = importances.top(); // 현재 문서들 중 가장 큰 중요도

            // 현재 deq 의 front 요소의 중요도보다 top 의 값이 더 크면 deq 의 front 요소를 맨 뒤로 보내기
            pair<int, int> cur = docs.front();
            if (cur.second < top)
                docs.push_back(cur);
            else {
                // 현재 deq 의 front 요소의 중요도가 top 보다 크거나 같다면 출력
                importances.pop(); // 이제 얘는 제거
                
                // 궁금했던 요소의 인덱스와 같다면 출력하고 while 종료
                if (cur.first == m) {
                    cout << cnt << "\n";
                    break;
                }

                cnt++; // 같지 않으면 cnt 값 +1 해주고 다시 돌아가기 
            }
            docs.pop_front();
        }
    }

    return 0;
}

 

문제 보자마자 우선 순위 큐랑 덱을 같이 쓰면 쉽게 해결할 수 있겠다는 생각이 들었다. 내가 생각한 풀이 방법은 다음과 같다.

 

  1. 일단 덱에는 pair<int, int> 타입의 요소를 넣어주고, 우선 순위 큐에는 int 타입의 요소를 넣어준다.
  2. 덱에서 pair 의 첫번째 요소는 인덱스, 두번째 요소는 중요도를 의미하도록 했다. 우선 순위 큐는 최대힙으로 동작하도록 했고 요소는 중요도를 의미하도록 했다.
  3. 매 반복마다 최대힙에서 top 요소를 가져오는데 이 값이 현재 덱의 front 요소의 중요도보다 크다면 front 요소를 덱의 맨 뒤로 넣어주고, 그렇지 않다면 cnt 값을 1 증가시키고 덱에서 front 요소를 빼는 식으로 구현한다.
  4. 그런데 만약 내가 궁금했던 요소의 인덱스와 현재 빼려고 하는 요소의 인덱스가 같다면 cnt 값을 출력하고 while 문을 종료하도록 한다.

 

위와 같은 풀이 방식으로 코드를 구현하면 쉽게 해결할 수있는 문제였다. 다른 사람들 풀이도 봤는데 나랑 진짜 거의 똑같이 푼 사람도 있어서 재밌었다. 

 

 

 

참고자료:

[백준] 1966번: 프린터 큐 [C++]

 

[백준] 1966번: 프린터 큐 [C++]

알고리즘 분류: 구현, 자료 구조, 시뮬레이션, 큐 문제 링크: https://www.acmicpc.net/problem/1966 1966번: 프린터 큐 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명

baehoon.tistory.com

-> 이게 나랑 풀이 방법이 거의 비슷한 코드였다.

 

[C언어] 백준 1966번: 프린터 큐 : 네이버 블로그

 

[C언어] 백준 1966번: 프린터 큐

https://www.acmicpc.net/problem/1966 처음엔 우선순위가 들어가길래 '뭐지?... 우선순위 큐로 풀어...

blog.naver.com

-> 이건 완전 다르게 풀었는데 신기해서 가져와봤다.

'백준 문제/자료구조' 카테고리의 다른 글
  • [백준] 2504번 괄호의 값
  • [백준] 10799번 쇠막대기
  • [백준] 1158번 요세푸스 문제
  • [백준] 1021번 회전하는 큐
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (343)
      • 프로그래밍언어론 정리 (5)
      • 컴퓨터네트워크 정리 (5)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 백준 문제 (196)
        • 이분탐색 (7)
        • 투포인트 (10)
        • 그래프 (7)
        • 그리디 (24)
        • DP (25)
        • BFS (18)
        • MST (7)
        • KMP (4)
        • Dijkstra (3)
        • Disjoints Set (4)
        • Bellman-Ford (2)
        • 시뮬레이션 (3)
        • 백트래킹 (15)
        • 위상정렬 (5)
        • 자료구조 (25)
        • 기하학 (1)
        • 정렬 (11)
        • 구현 (8)
        • 재귀 (8)
        • 수학 (8)
      • 유니티 공부 (11)
        • 레트로의 유니티 게임 프로그래밍 에센스 (11)
        • 유니티 스터디 자료 (0)
        • C# 공부 (0)
      • 유니티 프로젝트 (48)
        • 케이크게임 (13)
        • 점토게임 (35)
      • 언리얼 공부 (10)
        • 이득우의 언리얼 프로그래밍 (10)
      • 진로 (1)
      • 논문 읽기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    그래프
    해시
    언리얼
    이득우
    레트로의 유니티 프로그래밍
    정렬
    티스토리챌린지
    BFS
    바킹독
    시뮬레이션
    그리디
    투포인터
    이분탐색
    유니티 프로젝트
    백준
    백트래킹
    수학
    dp
    유니티
    큐
    재귀
    맵
    이벤트 트리거
    우선순위큐
    골드메탈
    유니티 공부 정리
    C#
    스택
    자료구조
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[백준] 1966번 프린터 큐
상단으로

티스토리툴바