Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

끄적끄적

백준 1021 회전하는 큐 본문

알고리즘

백준 1021 회전하는 큐

yenacathy97 2020. 7. 9. 02:57

이 문제는 순환큐 문제라 하여 순환큐를 구현해야 할까 고민하였으나 직접 원소를 삽입하는 것이 아니라서 그냥 배열을 이동하는 것으로 구현하였다.

내가 찾는 값이 현재 가장 처음 원소에서 왼쪽으로 얼마나 떨어져 있는지 확인하고 그 값이 과반수 이상이면 오른쪽으로 이동하고 과반수가 되지 않으면 왼쪽으로 이동하였다. 

#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