Queue 팀 활동 결과-(백준 1966번, 정올 1697번)

채재헌·2022년 7월 19일
0
post-thumbnail

1. 접근 방법


(1) 백준 1966번(프린터 큐) : 먼저 문서의 개수인 N과, 몇 번째로 인쇄되었는지를 나타내는 M값을 입력 받고 N개의 문서의 중요도 우선순위를 입력받은 후 최댓값을 구한 뒤 현재의 front를 최댓값을 만날 때까지 이동시켜 준 다음에 만약 front가 m과 같게 된다면 출력을 하면 될 것 이라고 생각하였습니다. 그리고 만약 같지 않으면 front를 한 칸 이동시켜주고, 현재 front 위치에 있는 값과 최댓값을 0으로 초기화해주고 이에 대한 과정을 계속 반복한다면 해당 프로그램에 맞는 출력값을 구할 수 있을것이라고 생각하였습니다.

[문제링크] : 링크텍스트


(2) 정올 1697번 (큐) : 먼저 각 명령어의 수인 N의 값을 입력하고, N의 개수까지 반복하는 for반복문을 통해 명령어를 입력후 주어진 명령의 종류인 I와 o에 따른 조건문을 통해 해당하는 명령어의 기능을 구현하고, 큐사이즈를 출력하는 출력문을 만든다면 해당 프로그램을 만들 수 있을거라고 생각하였습니다.

[문제링크] : 링크텍스트


2. 소스코드 +주석


(1) 백준 1966번(프린터 큐)


#include <stdio.h>

int main(void)
{
       int cnt, n, m;//케이스,정수변수 선언
       int arr[100] = { 0 };//문자열 초기화
       scanf("%d", &cnt);//테스트 케이스의 수 입력

       for (int i = 0; i < cnt; i++) {
               scanf("%d %d", &n, &m);//정수 N M 입력
               int ans = 1;
               int front = 0;
               int max = 0;
               //우선 순위 입력받기
               for (int j = 0; j < n; j++)
                       scanf("%d", &arr[j]);//중요도 입력

               while (1)
               {//최댓값 찾기
                       for (int k = 0; k < n; k++) {
                               if (arr[k]>max)
                                       max = arr[k];
                       }
                       //최댓값을 찾을때까지 front 이동
                       while (arr[front] != max)
                               front = (front + 1) % n;

                       if (front == m)
                               break;

                       arr[front] = 0;
                       front = (front + 1) % n;
                       max = 0;
                       ans++;
       }
               printf("%d\n", ans);//문서 차례 출력
       }
       return 0;
}

(2) 정올 1697(큐)

#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_SIZE 100

typedef int element;
typedef struct {
	int front;
	int rear;
	element data[MAX_QUEUE_SIZE];
}QueueType;

void error(char* message)
{
	fprintf(stderr, "%s\n", message);
	exit(1);
}

void init_queue(QueueType* q)
{
	q->front = -1;
	q->rear = -1;
}

int is_full(QueueType* q)
{
	if (q->rear == MAX_QUEUE_SIZE - 1)
		return 1;
	else
		return 0;
}

int is_empty(QueueType* q)
{
	if (q->front == q->rear)
		return 1;
	else
		return 0;
}

void enqueue(QueueType* q, int item)
{
	if (is_full(q))
	{
		error("full");
		return;
	}
	q->data[++(q->rear)] = item;

}

int dequeue(QueueType* q)
{
	if (is_empty(q))
	{
		printf("emty\n");
	}
	else {
		int item = q->data[++(q->front)];
		return printf("%d\n", item);
	}
}


int main(void)
{
	QueueType q;
	init_queue(&q);

	int i = 0, n, num;
	char select;

	scanf("%d",&n);

	while (i < n)
	{
		scanf("%c", &select);
		if (select == '1')		/*1 num 입력시 정수  num을 enqueu*/
		{
			scanf("%d", &num);
			enqueue(&q, num);
			i++;
		}
		else if (select == 'o') /*o 입력시 dequeue*/
		{
			dequeue(&q);
			i++;
		}
		else if (select == 'o')
		{
			printf("%d\n", (q.rear - q.front));	/*'o' 입력 시 큐에 있는 데이터 개수 출력*/
			i++;
		}
	}
	return 0;

}

3. 알고리즘

(1) 백준 1966번(프린터 큐)

1) 케이스,정수변수 선언 및 문자열 초기화 후 테스트 케이스의 수를 입력한다.

2) for문을 통해 주어진 각 케이스 마다 N과 M의 정수변수(문서의 개수, 인쇄 횟수)를 입력하고 중요도를 입력한다.

3) ans값과 front 값과 max의 값을 초기화해 준다.

4-1) 주어진 front=(front+1)%n을 통한 원형 큐에서 최댓값을 구한 뒤에 현재의 front를 최댓값을 만날때까지 이동시켜준 다음에 front가 max과 같다면 출력을 하게한다.

4-2) 만약 front와 max의 값이 같지 않으면 front를 한 칸 이동시켜주고, 현재 front 위치에 있는값과 최댓값을 0으로 초기화해주고 위의 3)-(1) 과정을 다시 한번 반복한다.

5) 프로그램 종료


(2) 정올 1697(큐)

1) 구조체 큐(QueueType)를 만든다.

2) 큐 값을 초기화 하는 함수 init_queue를 만든다.

3) 큐가 가득찼는지, 비어있는 상태인지 확인하기 위한 함수 is_full과 is_empty를 만든다.

4) 큐에 값을 넣는 enqueue함수와 큐의 값을 출력하는 dequeue함수를 만든다.

5) 몇 개의 명령어를 입력할 것인지 변수 n에 값을 입력 받는다. 그 후 n값만큼 반복

6) 'i num' 입력 시 정수 num을 enqueue

7) 'o' 입력 시 dequeue

8) 'c' 입력 시 큐에 있는 데이터 개수 출력


4. 문제 통과 캡쳐 화면


(1) 백준 1966번(프린터 큐)


(2) 정올 1697(큐)


5. 느낌점

이번 백준의 프린터 큐 문제와 정올의 큐 문제를 풀어보면서 수업에서 배운 큐에 대한 개념과 내용을 바탕으로, 이번 문제의 난이도를 조금 쉬운 난이도로 선택하여 이번 큐 테스트를 큐 ADT를 활용하지 않고 문제를 쉽게 풀 수 있었다. 이 문제를 풀어보면서 깨달은 바는 원형 큐의 Enqueue와 Dequeue의 개념과 작동 원리 개념에 대해 다잡는 활동이 되었고, 특히 프린트 큐를 구현 할때 큐의 이동과정에서 front=(front+1)%1이라는 수식을 사용하여 이 와 같은 수식을 다른 원형 큐문제나 원리에 유용하게 사용될것이라는 생각도 하였으며, 앞으로 큐에 대한 이해와 원리를 얻은 것을 기반으로 큐 ADT를 활용한 문제를 풀어서 큐에 대한 전반적인 실력을 늘리고 싶은 마음이 들었고 더 다양한 큐의 문제를 접근하고 싶었다.

0개의 댓글