회전하는 큐

문제 링크: https://www.acmicpc.net/problem/1021

 

1021번: 회전하는 큐

첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가

www.acmicpc.net

그리 어렵지 않은 문제였는데 왜이리 헤메었는지 모르겠다.
큐 관련해서 공부하다 이 문제에 접해서 해당 코드를 그대로 들고와서 풀려고 했다.
그래서 왼쪽 회전, 오른쪽 회전 일일이 구현한 코드이다.

왼쪽으로 돌지 오른쪽으로 돌지 판단하여 회전을 시키면서 그 횟수를 카운트 한다.
그 판단은 삭제할 수가 정 가운데 기준으로 왼쪽에 위치하는지 오른쪽에 위치하는지가 기준이 된다.

정답코드

#include<iostream>
using namespace std;

class Queue {
    int* arr;
    int size;
    int idxsize;
    int* idx;

    int count;
public:
    Queue(int Cap, int M) :arr(0), size(Cap), idxsize(0), count(0) {
        this->arr = new int[Cap + 1];
        for (int i = 0; i <= Cap; i++)
            arr[i] = i;
        this->idx = new int[M];
    }
    void Push(int data) {
        idx[idxsize] = data;
        idxsize++;
    }
    void Pop() {
        arr[1] = 0;
        Lshift();
        size--;
    }
    void Lshift() {
        int temp = arr[1];
        for (int i = 2; i <= size; i++)
            arr[i - 1] = arr[i];
        arr[size] = temp;
    }
    void Rshift() {
        int temp = arr[size];
        for (int i = size; i >= 2; i--)
            arr[i] = arr[i - 1];
        arr[1] = temp;
    }
    void printA() {
        for (int i = 0; i < idxsize; i++) {
            if (arr[1] == idx[i]) {
                Pop();
                continue;
            }
            if (find(idx[i])) {
                //왼쪽에 존재
                while (arr[1] != idx[i]) {
                    Lshift();
                    count++;
                }
                if (arr[1] == idx[i])
                    Pop();
            }
            else {
                //오른쪽에 존재
                while (arr[1] != idx[i]) {
                    Rshift();
                    count++;
                }
                if (arr[1] == idx[i])
                    Pop();
            }
            //print();
        }
        cout << count << endl;
    }
    bool find(int a) {
        for (int i = size / 2 + 1; i >= 1; i--)
            if (arr[i] == a)
                return true;
        return false;
    }
};


int main() {
    int N, M;
    cin >> N >> M;
    Queue q(N, M);
    while (M--) {
        cin >> N;
        q.Push(N);
    }

    q.printA();

    return 0;
}

'ProblemSolving' 카테고리의 다른 글

[BOJ] 1003_피보나치 함수  (0) 2021.01.21
[BOJ] 1026_보물  (0) 2021.01.20
[BOJ] 1015_수열정렬  (0) 2021.01.18
[BOJ] 1002_터렛  (0) 2021.01.17
[BOJ] 1037_약수  (0) 2021.01.16
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기