끄적끄적
백준 1021 회전하는 큐 본문
이 문제는 순환큐 문제라 하여 순환큐를 구현해야 할까 고민하였으나 직접 원소를 삽입하는 것이 아니라서 그냥 배열을 이동하는 것으로 구현하였다.
내가 찾는 값이 현재 가장 처음 원소에서 왼쪽으로 얼마나 떨어져 있는지 확인하고 그 값이 과반수 이상이면 오른쪽으로 이동하고 과반수가 되지 않으면 왼쪽으로 이동하였다.
#include<iostream>
using namespace std;
int main() {
int size; //큐의 크기
int popnum; //뽑아낼 원소
cin >> size >> popnum;
int *find = new int[popnum]; //뽑아낼원소가 저장된 배열
int *arr = new int[size]; // 큐 배열
bool right = false; // 오른쪽으로 이동할지 왼쪽으로 이동할지 구분
int temp=0; // 이동할 때 임시로 저장할 변수
int count = 0; // 이동한 횟수를 저장할 변수
for (int i = 0; i < popnum; i++) {
cin >> find[i]; //뽑아낼 원소들을 입력하여 배열 생성
}
for (int i = 0; i < size; i++) {
arr[i] = i+1; // 큐에는 크기만큼 순서대로 값이 들어감
}
for (int i = 0; i < popnum; i++) {
right = false; //right 변수 초기화
while (find[i] != arr[0]) { // 뽑아낼 원소가 가장 처음 원소가될 때까지
int j = 0, k = size - i, cnt1 = 0;
while (arr[j] != find[i]) { //이동할 방향을 정하기 위해 원소를 찾을때까지
j++; // 얼마나 떨어져있는지 카운트(즉 왼쪽으로 얼마나 움직여야하는지)
}
if (j > size / 2) { // 왼쪽으로 이동해야하는 횟수가 전체 원소 개수 과반수 이상이면
right = true; //오른쪽으로 이동하는게 더 최소
}
if (right == true) { //오른쪽으로 이동해야하는 경우
for (int i = size-1; i >= 0; i--) {
if (i == size-1) { //가장 끝 원소이면
temp= arr[i]; // temp에 값을 저장
}
else arr[i+1] = arr[i]; // 가장 끝 원소가 아니면 오른쪽으로 한칸씩 이동
if (i == 0) arr[i] = temp; //가장 처음 원소에는 temp에 저장된 값 삽입
}
count++; // 이동한 횟수 증가
}
else { // 왼쪽으로 이동해야하는 경우
for (int i = 0; i < size; i++) {
if (i == 0) { //가장 처음 원소이면
temp = arr[i]; //temp에 값 저장
arr[i] = arr[i + 1]; //한칸 왼쪽으로 이동
}
else arr[i] = arr[i+1]; //한칸씩 왼쪽으로 이동
if (i == size-1) arr[size - 1] = temp; // temp에 저장된 값을 마지막에 삽입
}
count++; //이동 횟수 증가
}
}
for (int i = 0; i < size; i++) { // 처음 원소가 찾는 값이면
if (i == size - 1) { //가장 마지막 원소는 없엤기에 마지막이라 표시
arr[i] = '\0';
break;
}
arr[i] = arr[i + 1]; //나머지 원소는 한칸씩 앞으로 당겨줌
}
size--; //전체 크기 1 감소
}
cout << count << endl;
}
'알고리즘' 카테고리의 다른 글
백준 1700 멀티탭 스케줄링 (0) | 2021.04.06 |
---|---|
백준 14719 - 빗물(C++) (0) | 2021.03.31 |
2019 카카오 개발자 겨울 인턴십크레인 인형뽑기 게임 (0) | 2020.09.24 |
11060: 점프점프 (0) | 2020.08.05 |
백준 2407번 조합 풀이 (0) | 2020.08.04 |
Comments