일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 운전이론
- C
- 시드니
- UTS
- 교환학생짐싸기
- 철도교통안전관리자
- C++
- 백준
- 교환학생짐싸기리스트
- 시드니기숙사
- 1421번
- scapesydneycentral
- 교환학생짐
- 나무꾼이다솜
- 열차운전
- 호주학생비자
- 호주휴대폰개통
- 교환학생
- 호주기숙사
- 교통법규
- subclass500
- 교통안전관리론
- 호주비자신체검사
- c언어
- 군전세객차
- Scape
- BOJ
- 호주
- 교통안전법
- 철도공학
- Today
- Total
탐정사무소
1966번 프린터 큐(C) 본문
큐(queue)라는 것이 자료구조에 나온다는데, 이번 학기에 자료구조를 들을 시간이 만들어지지가 않아서
그냥 인터넷으로 대강 배워야겠다. 이 문제를 통해 큐에 대해 조금 알아볼 수 있었다.
https://www.acmicpc.net/problem/1966
1966번: 프린터 큐
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에
www.acmicpc.net
문제
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다.
- 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를 확인한다.
- 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면, 이 문서를 인쇄하지 않고 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
코드
#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 |