백준 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);
}
}
총평
난이도
⭐⭐★★★
후기
개선할 점
없