알고리즘

백준 No.13458 시험감독 - JAVA

jaewoo 2023. 2. 7. 23:42

 

 

문제

 

총 N개의 시험장이 있고, 각가의 시험장마다 응시자들이 있다. i번 시험장에 있는 응시자의 수는 A명이다.

감독관은 총감독관과 부감독관으로 두 종류가 있다. 총감독관으,ㄴ 한 시험장에서 감시할 수 있는 응시자의 수가 B명이고, 부감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 C명이다.

 

각각의 시험장에서 총감독관은 오직 1명만 있어야 하고,, 부감독관은 여러 명 있어도 된다.

각 시험장마다 응시생들을 모두 감시해야 한다. 이때 필요한 감독관 수의 최솟값을 구하는 프로그램을 작성하시오

 

 

 

풀이

 

처음 while문으로 전부 순회하며 푸니 당연하게 시간초과..

순서

1. 총감독은 한명은 무조건 있어야 하고 그 이상은 존재할 수 없다. 결국 주어진 교실만큼 총감독이 들어감

2. 학생이 100명일 경우 총감독을 여기서 뺀 후 

3. 그 결과가 0 보다 클 경우 부감독의 수로 나눠 몫을 구하는데 몫이 0일 경우 부감독 수보다 작은 수일 확률이 있다.

4. 그래서 나머지가 0이 아닌 경우 감독 수 플러스 1을 해주면 된다. \

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {


    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int arr[] = new int[N];
        for(int i=0;i<N;i++){
                arr[i] = Integer.parseInt(st.nextToken());
        }
        st = new StringTokenizer(br.readLine());
        int B = Integer.parseInt(st.nextToken());   //총 감독이 케어할 수 있는 수
        int C = Integer.parseInt(st.nextToken());   //부 감독이 케어할 수 있는 수

        long temp = N;	//교실에 한 명씩 총감독이 들어가야하기 때문에
      
        for(int i=0;i<arr.length;i++){
            arr[i] -= B;	//감독이 케어할 학생의 수는 뺀다.
             
            if(arr[i] > 0){	//위에 빼기를 하고도 숫자가 남았는지 체크
                temp += arr[i] / C;	//부감독이 케어할 수 있는 수로 나눈다.
                if(arr[i] % C != 0){	//만약 나눴는데 0이 아니면
                    temp++;	//부감독이 케어할 수보다 작지만 0보다는 크다는 이야기
                }

            }

           
        }
        System.out.println(temp);	//위에 과정들을 반복해 결과출력
    }
}