탐정사무소

1966번 프린터 큐(C) 본문

학과공부/백준

1966번 프린터 큐(C)

탐정이죠 2021. 8. 12. 18:05
반응형

큐(queue)라는 것이 자료구조에 나온다는데, 이번 학기에 자료구조를 들을 시간이 만들어지지가 않아서
그냥 인터넷으로 대강 배워야겠다. 이 문제를 통해 큐에 대해 조금 알아볼 수 있었다.
https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net

문제

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다.

  1. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다.
  2. 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치 한다. 그렇지 않다면 바로 인쇄를 한다.

예를 들어 Queue에 4개의 문서(A B C D)가 있고, 중요도가 2 1 4 3 라면 C를 인쇄하고, 다음으로 D를 인쇄하고 A, B를 인쇄하게 된다.
여러분이 할 일은, 현재 Queue에 있는 문서의 수와 중요도가 주어졌을 때, 어떤 한 문서가 몇 번째로 인쇄되는지 알아내는 것이다. 예를 들어 위의 예에서 C문서는 1번째로, A문서는 3번째로 인쇄되게 된다.

사전지식

원형 큐에 대해 알아보고자 했다. 블로그에서 설명을 읽어보았다.
https://lktprogrammer.tistory.com/59?category=676210

 

03 원형 큐 (Circular Queue) 자료 구조

원형큐 (Circular Queue) 원형 큐는 선형 큐의 문제점을 보완하기 위한 자료구조입니다. 앞선 포스팅에서 선형큐의 문제점은 rear이 가르키는 포인터가 배열의 마지막 인덱스를 가르키고 있을 때 앞

lktprogrammer.tistory.com


큐는 FIFO, 즉 첫 번째에 들어온 데이터가 먼저 나가는 구조이다. 선형 큐일 때 문제점은 Dequeue할 때 발생하는 빈 공간이 쓰이지 못해 낭비가 있다는 점인데, 원형 큐는 원이기 때문에 그 공간의 낭비를 줄일 수 있다.

해결과정

Tim님의 풀이를 참고했다. 원형 큐를 어떻게 쓰는지 몰랐기 때문에 코드는 거의 비슷하게 썼다. 코드를 다 쓰면서, 코드의 흐름을 이해하는 방식으로 학습하였다.
먼저 입력받은 수 중에서 최댓값을 찾고, 최댓값을 찾기 위해 front가 원형 큐를 이동한다. 그 이동 과정에서 f=(f+1)%n이라는 수식이 사용되었는데, 원형 큐에서 꽤 유용할 듯 하다.
front가 최댓값을 찾았을 때, 만약 그것이 우리가 원하는 수라면 모든 과정을 종료하고, 원하는 수가 아니라면 최댓값 수를 0으로 만들어버리고 다시 새로운 최댓값을 찾아 위 과정을 반복한다.
https://blog.naver.com/qudgh0745/222102319159

 

백준 1966(프린터 큐) C언어

저는 먼저 큐에서 최댓값을 구한 뒤에 현재의 front를 최댓값을 만날 때까지 이동시켜준 다음에 front가 m...

blog.naver.com

예시) n=4, m=2, 1 2 3 4 중요도일 경우 답은 2번째.

 

코드

#include <stdio.h>
int main() {
	int cnt, n, m;
	int i, j, k;
	int arr[100] = { 0, };

	scanf("%d", &cnt);

	for (i = 0; i < cnt; i++)
	{
		scanf("%d %d", &n, &m);
		int ans = 1;
		int front = 0;
		int max = 0;
		for (j = 0; j < n; j++)
			scanf("%d", &arr[j]);

		while (1) 
		{
			for (k = 0; k < n; k++) {
				if (arr[k] > max) max = arr[k];
			}

			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;
}

결과

반응형

'학과공부 > 백준' 카테고리의 다른 글

2108번 통계학(C)  (1) 2021.08.15
1978번 소수 찾기(C)  (0) 2021.08.14
1929번 소수 구하기(C)  (0) 2021.08.12
15552번 빠른 A+B(C/C++)  (0) 2021.08.11
1920번 수 찾기(C)  (0) 2021.08.11
Comments