BOJ

백준[C언어] 1966: 프린터 큐

횰임 2022. 1. 26. 14:02

 

✅문제

1. 문서의 개수 N과 인쇄 순서를 알고 싶은 문서의 인덱스 M이 주어진다.

2. N개의 문서의 중요도가 0번~N-1번 인덱스 순서대로 주어진다.

3. 중요도가 높은 문서 먼저 인쇄된다. 

4. 중요도 최대값의 인덱스를 front로 둔다. 그리고 크기 N인 배열 하나 더 만들어서 이 front값을 해당 문서 인덱스 요소값으로 넣는다. 

5. front 기준 오른쪽으로 돌면서 그 다음 최대값을 찾아서 front+1로 둔다. 마찬가지로 해당 문서 인덱스 요소 값으로 front+1값을 저장.

6. 만약 배열의 끝(N-1)에 다다르면 0번 부터 front의 인덱스-1까지 5번과정 반복.

 

✅정리

step1) 크기가 N인 중요도 배열(요소값: 문서의 중요도) 과 큐 인덱스 배열(요소값: 큐 인덱스) 생성

step2) 중요도 배열에서 최대 중요도값을 찾고, 그것의 인덱스를 front라는 변수에 저장한다. 

step3) 큐 인덱스 배열에서 최대 중요도값의 인덱스 자리에 front값을 저장한다.  

step4) 중요도 배열에서 front인덱스 기준 오른쪽(front+1~)으로 돌면서 그 다음 최대값을 찾는다. 

이때 배열의 끝(N-1)에 다다르면 검색 중인 인덱스를 0으로 바꾸고 front-1까지 검색 계속한다.

step5) 최대값 찾을 때마다 count하고, count == N-1이 되면 검색 종료

step6) 완성된 큐 인덱스 배열을 가지고 원하는 문서인덱스[i]의 인쇄 순서를 구한다. 

 

👊Try 1

#include <stdio.h>
#include <stdlib.h>

int main()
{ 
  int i;
  int *Q_index; //큐 인덱스 배열
  int *Importance;  //중요도 배열
  int N, M; //N:문서 개수, M:원하는 문서인덱스
  scanf("%d %d", &N, &M);
  Importance = calloc(N, sizeof(int));
  Q_index = calloc(N, sizeof(int));
  for(i=0; i<N; i++)
  {
    scanf("%d", &Importance[i]);
  }

  //최대 중요도 값 검색
  int max_import = 0;
  int front;
  for(i=0; i<N; i++)
  {
    if(max_import <= Importance[i])
    {
      max_import = Importance[i];
      front = i;
    }
  }
  Q_index[front] = front;

  //front인덱스 기준 오른쪽으로 돌면서 그 다음 최대값 찾기
  max_import = 0;
  int temp;
  int count = 0;
  int search_index = front;
  do{
    for(i=++search_index; i<=search_index-1; i++)
  {
    if(search_index > N-1)
    {
      i = 0;
    }
    if(max_import <= Importance[i])
    {
      max_import = Importance[i];
      temp = i;
    }
  }
  //최대값 찾기 완료 하면
  count++;
  Q_index[temp] = front + count;
  Importance[temp] = 0;

  }while(count == N-1);
  
  int print_seq;
  print_seq = (Q_index[M] > front ? Q_index[M] : front) - (Q_index[M] < front ? Q_index[M] : front) +1; 
  printf("%d", print_seq);
  
  return 0;
}

❓문제 찾는 중