알고리즘
[CodeTree] 바이러스 검사 Java 풀이
빠르게 핵심만
2024. 2. 23. 18:04
풀이
각 식당별로 필요한 최소 검사자의 수를 구해 전부 더해주면 됩니다.
각 식당에는 팀장 한 명은 무조건 필요하므로, 식당에 있는 고객의 수에서 팀장이 검사할 수 있는 고객의 수를 뺀 나머지 고객을 모두 검사하기 위해 필요한 팀원의 수를 구하면 됩니다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int n;
static int[] customers;
static int leaderCapacity, memberCapacity;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
customers = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
customers[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
leaderCapacity = Integer.parseInt(st.nextToken()); // 검사 팀장이 검사할 수 있는 최대 고객 수
memberCapacity = Integer.parseInt(st.nextToken()); // 검사 팀원이 검사할 수 있는 최대 고객 수
long minCount = 0; // 검사자의 최소의 수
for (int i = 0; i < n; i++) {
// 검사 팀장은 꼭 한 명 필요하다.
minCount++;
// 필요한 검사 팀원을 더한다.
minCount += requiredMemberNum(customers[i] - leaderCapacity);
}
System.out.println(minCount);
}
static int requiredMemberNum(int customerNum) {
// 남은 고객이 없다면 검사 팀원은 필요 없다.
if (customerNum <= 0) {
return 0;
}
// 정확히 나누어떨어지는 경우 몫만큼의 검사 팀원이 필요하다.
if (customerNum % memberCapacity == 0) {
return customerNum / memberCapacity;
}
// 정확히 나누어떨어지지 않는 경우 1명이 추가적으로 더 필요하다.
return customerNum / memberCapacity + 1;
}
}