일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- fsb
- 백트래킹
- 스택
- 이진 탐색
- BOF
- syscall
- 동적 계획법
- RTL
- 에라토스테네스의 체
- 투 포인터
- 이분 탐색
- tcache
- ROP
- 이진트리
- House of Orange
- 스위핑 알고리즘
- BFS
- 수학
- 완전 탐색
- heap
- DFS
- OOB
- 다이나믹 프로그래밍
- off by one
- 연결리스트
- 큐
- 문자열 처리
- 포맷스트링버그
- 브루트 포스
- 분할 정복
Archives
- Today
- Total
SDJ( 수돈재 아님 ㅎ )
[C] 1021 - 회전하는 큐 본문
문제링크 : https://www.acmicpc.net/problem/1021
1021번: 회전하는 큐
첫째 줄에 큐의 크기 N과 뽑아내려고 하는 수의 개수 M이 주어진다. N은 50보다 작거나 같은 자연수이고, M은 N보다 작거나 같은 자연수이다. 둘째 줄에는 지민이가 뽑아내려고 하는 수의 위치가 ��
www.acmicpc.net
원형큐로 풀고싶어서 원형큐로 구현해서 풂
#include<stdio.h>
#include<stdlib.h>
typedef struct Queue
{
int *Queue;
int front;
int rear;
int Queue_size;
}Queue;
void pop(Queue *pQueue);
void Left(Queue *pQueue);
void Right(Queue *pQueue);
int findidx(Queue *pQueue, int data);
int main(void)
{
Queue Q = {NULL, 0, 0};
int n, m;
int pop_list[51]={0};
int pop_list_len = 0;
int res=0;
int tmp;
scanf("%d %d", &n, &m);
Q.Queue = (int *)malloc(sizeof(int)*(n+1));
Q.Queue_size = n+1;
for(int i = 1; i<=n; ++i)
{
Q.rear = (Q.rear+1)%Q.Queue_size;
Q.Queue[Q.rear] = i;
}
while(m--)
scanf("%d", &pop_list[pop_list_len++]);
pop_list_len=0;
while(pop_list[pop_list_len] != 0){
tmp = findidx(&Q, pop_list[pop_list_len])-1;
int t=tmp;
int f = Q.front;
int r = Q.rear;
if(f < r)
{
if(r-t < t-f)
{
for(int i = 0; i < r-t; ++i)
Right(&Q);
pop(&Q);
res += r-t;
}
else
{
for(int i = 0; i < t-f; ++i)
Left(&Q);
pop(&Q);
res += t-f;
}
}
else
{
if(t < f)
{
if(r-t < (t+Q.Queue_size-f))
{
for(int i = 0; i < r-t; ++i)
Right(&Q);
pop(&Q);
res += r-t;
}
else
{
for(int i = 0; i < t+Q.Queue_size-f; ++i)
Left(&Q);
pop(&Q);
res += t+Q.Queue_size-f;
}
}
else
{
if(r+Q.Queue_size-t < t-f)
{
for(int i = 0; i < r+Q.Queue_size-t; ++i)
Right(&Q);
pop(&Q);
res += r+Q.Queue_size-t;
}
else
{
for(int i = 0; i < t-f; ++i)
Left(&Q);
pop(&Q);
res += t-f;
}
}
}
pop_list_len++;
}
printf("%d\n", res);
free(Q.Queue);
return 0;
}
void pop(Queue *pQueue)
{
pQueue->front = (pQueue->front+1)%pQueue->Queue_size;
pQueue->Queue[pQueue->front] = 0;
}
void Left(Queue *pQueue)
{
int tmp;
pQueue->front = (pQueue->front+1)%pQueue->Queue_size;
tmp = pQueue->Queue[pQueue->front];
pQueue->Queue[pQueue->front] = 0;
pQueue->rear = (pQueue->rear+1)%pQueue->Queue_size;
pQueue->Queue[pQueue->rear] = tmp;
}
void Right(Queue *pQueue)
{
int tmp;
tmp = pQueue->Queue[pQueue->rear];
pQueue->Queue[pQueue->rear] = 0;
pQueue->rear = (pQueue->rear-1+pQueue->Queue_size) % pQueue->Queue_size;
pQueue->Queue[pQueue->front] = tmp;
pQueue->front = (pQueue->front-1+pQueue->Queue_size) % pQueue->Queue_size;
}
int findidx(Queue *pQueue, int data)
{
for(int cnt = 0; cnt < pQueue->Queue_size; ++cnt)
{
if(pQueue->Queue[cnt] == data)
return cnt;
}
}
'알고리즘 > Backjoon' 카테고리의 다른 글
[C++] 17267 - 상남자 (0) | 2020.07.01 |
---|---|
[C++] 1013 - Contact (0) | 2020.06.30 |
[C++] 12904 - A와 B (0) | 2020.06.30 |
[C++] 1806 - 부분합 (0) | 2020.02.01 |
[C++] 2589 - 보물섬 (0) | 2020.02.01 |