백준 13458 - 시험 감독

Updated:

Java

13458 번 - 시험 감독

문제

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

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

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

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

접근 방법

간단한 배열문제이다.
주의 해야 할 것은, 응시자 수가 1,000,000 시험장이 1,000,000 그리고 총감독/ 부감독의 능력이 1이면 결과가 1,000,000 * 1,000,000 이므로 int값을 벗어난다.
따라서 결과를 담을 변수를 long으로 선언해주어야 한다.

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n;
	static long result = 0;		// *주의* 결과는 long으로!
	static int arr[];
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = stoi(br.readLine());
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	arr = new int[n];
    	
    	for(int i = 0 ; i < n; i++) {
    		arr[i] = stoi(stk.nextToken());
    	}
    	int b,c;
    	stk = new StringTokenizer(br.readLine());
    	b = stoi(stk.nextToken());
    	c = stoi(stk.nextToken());
    	
		// 총 감독관은 반드시 한명씩 필요하므로, 총 감독관의 감시 인원 수를 감소한다.
    	for(int i = 0; i < n; i++) {
    		arr[i] -= b;
    		result++;	// 총 감독관의 수를 늘린다.
    	}
    	long temp;
    	for(int i = 0; i < n; i++) {
			// 시험장의 인원이 0보다 작거나 같으면 부 감독관이 필요 없다.
    		if(arr[i] <= 0)
    			continue;
			// 부 감독관의 감시 수의 나머지를 구한다.
    		temp = arr[i] % c;
			// 만약 딱 떨어지면, 그 부 감독관의 수를 더하고, 나머지가 남으면 한명 추가한다.
    		if(temp == 0)
    			result += arr[i] / c;
    		else
    			result += arr[i] / c + 1;
    	}
    	System.out.println(result);
    	br.close();
	}
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

난이도

⭐⭐★★★

후기

개선할 점