[백준] 1021번 회전하는 큐

2024. 12. 29. 18:30·백준 문제/자료구조

문제: 1021번: 회전하는 큐

 

#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 n, m; // n: 큐의 크기, m: 뽑아내려고 하는 수의 개수
    cin >> n >> m;

    deque<int> rotateQueue;
    for (int i = 1; i <= n; i++)
        rotateQueue.push_back(i);

    queue<int> order;
    for (int i = 0; i < m; i++) {
        int tmp;
        cin >> tmp;
        order.push(tmp);
    }

    int totalCnt = 0;
    // 현재 큐의 상태를 저장해놓을 원형 큐 2개 만들기
    deque<int> dupleQueue1;
    deque<int> dupleQueue2;
    while (!order.empty()) {
        if (rotateQueue.front() == order.front()) {
            rotateQueue.pop_front();
            order.pop();
        }
        else {
            int tmpCnt1 = 0;
            int tmpCnt2 = 0;
            dupleQueue1 = rotateQueue;
            dupleQueue2 = rotateQueue;

            // 왼쪽으로 미는 경우, 오른쪽으로 미는 경우 두가지로 구분하고
            // 둘 중 더 연산이 적게 드는 애를 고르기!!
            // 일단 왼쪽으로 미는 경우
            while (dupleQueue1.front() != order.front()) {
                dupleQueue1.push_back(dupleQueue1.front());
                dupleQueue1.pop_front();
                tmpCnt1++;
            }

            // 오른쪽으로 미는 경우
            while (dupleQueue2.front() != order.front()) {
                dupleQueue2.push_front(dupleQueue2.back());
                dupleQueue2.pop_back();
                tmpCnt2++;
            }

            // 왼쪽으로 미는게 더 많은 연산이 필요하면 오른쪽으로 미는 경우 채택
            if (tmpCnt1 > tmpCnt2) {
                rotateQueue = dupleQueue2;
                totalCnt += tmpCnt2;
            }
            else {
                rotateQueue = dupleQueue1;
                totalCnt += tmpCnt1;
            }
        }
    }
    cout << totalCnt << "\n";


    return 0;
}

 

 

그냥 현재 상태를 저장해놓을 원형큐 2개를 따로 만들어놓고, 이를 업데이트 한 후 다시 현재 큐에 반영해주면 쉽게 해결할 수 있는 문제였다. dequeue 의 사용법만 잘 알고있다면 그냥 특징 이용해서 바로 풀 수 있는 문제인 것 같다. 

 

 

 

참고자료:

BaaaaaaaarkingDog | [실전 알고리즘] 0x07강 - 덱

 

[실전 알고리즘] 0x07강 - 덱

안녕하세요, 오늘도 반갑습니다. 스택과 큐에 이어 이번에는 덱을 다루겠습니다. 목차가 0x02만 바뀌고 계속 똑같습니다. 한 번 눈으로 슥 훑고 넘어가겠습니다. 덱은 Restricted Structure의 끝판왕과

blog.encrypted.gg

[C++] 백준 1021: 회전하는 큐

 

[C++] 백준 1021: 회전하는 큐

양방향 순환 큐에서 주어진 조건에 따라 몇 개의 원소를 순차적으로 뽑아 내고자 할 때, 최소의 연산 횟수를 출력하는 문제큐에서 사용할 연산은 다음과 같다.첫 번째 원소를 뽑아낸다.큐를 왼

velog.io

백준 1021번 회전하는 큐: C언어 풀이 :: 수서곤충의 세계

 

백준 1021번 회전하는 큐: C언어 풀이

백준 1021 회전하는 큐 문제의 C언어 해설입니다.큐의 회전을 구현하는 방법과, 문제에서 필요한 배열의 크기를 계산하는 방법을 설명합니다.전략큐의 회전 횟수를 어떻게 구할 수 있을까?처음엔

chinensis.tistory.com

 

 

'백준 문제/자료구조' 카테고리의 다른 글
  • [백준] 1966번 프린터 큐
  • [백준] 1158번 요세푸스 문제
  • [백준] 1874번 스택 수열
  • [백준] 10845번 큐
dubu0721
dubu0721
dubu0721 님의 블로그 입니다.
  • dubu0721
    dubu0721 님의 블로그
    dubu0721
  • 전체
    오늘
    어제
    • 분류 전체보기 (334) N
      • 컴퓨터네트워크 정리 (5)
      • 알고리즘&자료구조 공부 (64)
        • it 취업을 위한 알고리즘 문제풀이 입문 강의 (60)
        • 학교 알고리즘 수업 (3)
        • 실전프로젝트I (0)
      • 백준 문제 (193) N
        • 이분탐색 (7)
        • 투포인트 (10)
        • 그래프 (7)
        • 그리디 (24) N
        • DP (25)
        • BFS (15) N
        • 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)
      • 논문 읽기 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dubu0721
[백준] 1021번 회전하는 큐
상단으로

티스토리툴바