https://www.acmicpc.net/problem/13458
- 문제
- 문제 풀이
백준 13458번 시험 감독은 브론즈 2 난이도의 수학 문제이다. 이 문제에서는 n개의 시험장이 있고 각 i번 시험장에는 Ai명만큼의 응시자가 있다. 그리고 감독관으로는 총감독관과 부감독관이 있고 총감독관은 한 시험장에서 B명을 감시할 수 있고 부감독관은 한 시험장에서 C명을 감독할 수 있다. 그리고 각 시험장에 있는 모든 응시자들을 감시해야 할 때, 필요한 감독관의 최솟값을 구하면 되는 문제이다.
우선 이 문제에 써져있지는 않지만 각 시험장에 총감독관은 무조건 있어야 한다. 이것은 문제에서 주어진 예제 4번을 보면 알 수 있다.
필요한 감독관의 최솟값 수를 count라고 하겠다. 일단 각 시험장에는 무조건 총감독관이 있어야 하니까 count는 시험장 개수인 n부터 시작한다. 그리고 각 시험장에 있는 총감독관이 B명씩 감시할 수 있으니 각 시험장의 응시자 수에서 B씩 빼준다.
long count = n;
for (int i = 0; i < n; i++) {
A[i] -= b;
}
count는 무조건 int형 대신 long형으로 해야 한다. 왜냐하면 count를 int형으로 했을 때 int의 범위를 초과한다. 출력 값이 최대로 될 때는 B와 C가 모두 1이고, N이 1,000,000이며 모든 A의 값들이 1,000,000일 때이다. 이 경우, 답이 1,000,000,000,000으로 int 범위를 훨씬 넘는다.
각 시험장의 응시자 수에서 총감독관이 감시할 수 있는 B명씩 뺐다. 이제 부감독관만 추가될 수 있으므로 남아있는 응시자 수에서 C를 나눠준다. 소수점이 나오면 무조건 올림을 해준다. 이 값들을 count에 더하면 이게 답이 된다.
- 코드
import java.io.*;
import java.math.BigInteger;
import java.util.*;
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[] A = new int[n];
for (int i = 0; i < n; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
long count = n;
for (int i = 0; i < n; i++) {
A[i] -= b;
}
count += n;
for (int i = 0; i < n; i++) {
if (A[i] <= 0) continue;
long num = (long)Math.ceil((double)A[i]/(double)c);
count += num;
}
System.out.print(count);
}
}
- 후기
이 문제는 int형 대신 long형을 써야지 풀리는 문제이다. 나도 처음엔 모르고 int형을 썼다가 틀렸었다.
'백준' 카테고리의 다른 글
[백준] 1302번 : 베스트셀러 – JAVA [자바] (0) | 2022.04.22 |
---|---|
[백준] 2445번 : 별 찍기 - 8 – JAVA [자바] (0) | 2022.04.22 |
[백준] 10988번 : 팰린드롬인지 확인하기 – JAVA [자바] (1) | 2022.04.21 |
[백준] 17219번 : 비밀번호 찾기 – JAVA [자바] (0) | 2022.04.21 |
[백준] 17202번 : 핸드폰 번호 궁합 – JAVA [자바] (0) | 2022.04.21 |
댓글