[Java] 백준(브론즈-2) 13458번 - 시험 감독
문제 풀이
이번 문제는 사칙 연산을 통해 간단하게 풀 수 있는 문제이다.
아이디어 도출
바로 문제 풀이를 위한 아이디어를 살펴보자.
- 먼저 응시장 별로 최소 총 감독관이 N명만큼 필요하기에 필요한 감독관의 수를 N으로 두고 시작한다.
- 반복문을 통해 응시장별 응시자 수에서 총 감독관이 감독할 수 있는 수(B)만큼 차감한다.
- 총 감독관의 감독 수만큼 차감한 후 응시장 별 응시자 수가 0 이하라면 부감독관이 필요없기에 다음 순회로 넘어간다.
- 응시장별 응시자 수마다 부감독관이 감독할 수 있는 수(C)로 나눈만큼 부감독관 수가 필요하기에 나눈 값을 감독관 수에 더해준다.
- C로 나눈 나머지가 0이 아니라면, 부감독관이 추가적으로 1명 더 필요하기에 감독관 수에 1을 더해주면 된다.
위와 같이 나눗셈과 나머지를 잘 유의하면 풀면 쉽게 풀 수 있다.
또한 감독관의 수는 시험장의 개수와 학생 수를 고려해 int형이 아닌 long형으로 선언하여 풀어야 한다.
문제 풀이를 위해 작성한 코드는 아래와 같다.
작성코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
// 응시장 개수
int N = Integer.parseInt(br.readLine());
// 응시장 별 응시자 수를 담을 배열 선언 후 입력받음.
int[] candidates = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
candidates[i] = Integer.parseInt(st.nextToken());
}
// 총 감독관이 감독할 수 있는 수 B와 부 감독관이 감독할 수 있는 수 C 입력받음.
st = new StringTokenizer(br.readLine());
int B = Integer.parseInt(st.nextToken());
int C = Integer.parseInt(st.nextToken());
// 감독관 수는 총 N개에 응시장에 총 감독관이 최소 1명씩 배치되므로 N부터 시작한다.
// 시험장의 개수와 학생 수가 최대 1,000,000이기에 int형이 아닌 long형으로 선언해야 한다.
long viewerCnt = 0;
viewerCnt += N;
/**
* 1. 먼저, 총 감독관이 감시할 수 있는 수를 차감한다. 이때, 각 응시장별로 0명 이하라면, 부감독관이 필요 없기에 continue한다.
* 2. 0명 이상이라면, 부감독관이 필요하기 때문에 응시장 별 남은 응시자 수를 C로 나눈 값만큼을 감독관 수로 늘린다.
* 3. 이후 응시장별 남은 응시자 수를 C로 나눈 나머지가 0이 아니라면 추가적으로 부감독관이 필요한 것이기에 마지막으로 감독관 수를 1 늘린다.
*/
for(int i=0; i<N; i++) {
candidates[i] -= B;
if(candidates[i] <= 0) {
continue;
}
viewerCnt += candidates[i] / C;
if(candidates[i] % C != 0) {
viewerCnt++;
}
}
bw.write(viewerCnt+"\n");
}
}
}
출처
- 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.