회전하는 큐
문제 링크: https://www.acmicpc.net/problem/1021
그리 어렵지 않은 문제였는데 왜이리 헤메었는지 모르겠다.
큐 관련해서 공부하다 이 문제에 접해서 해당 코드를 그대로 들고와서 풀려고 했다.
그래서 왼쪽 회전, 오른쪽 회전 일일이 구현한 코드이다.
왼쪽으로 돌지 오른쪽으로 돌지 판단하여 회전을 시키면서 그 횟수를 카운트 한다.
그 판단은 삭제할 수가 정 가운데 기준으로 왼쪽에 위치하는지 오른쪽에 위치하는지가 기준이 된다.
정답코드
#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 |
최근댓글