출처 : https://www.acmicpc.net/problem/13458
1. 문제 설명
총 N개의 시험장이 있고, 각각의 시험장마다 응시자들이 있다. i번 시험장에 있는 응시자의 수는 Ai명이다.
감독관은 총감독관과 부감독관으로 두 종류가 있다. 총감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 B명이고, 부감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 C명이다.
각각의 시험장에 총감독관은 오직 1명만 있어야 하고, 부감독관은 여러 명 있어도 된다.
각 시험장마다 응시생들을 모두 감시해야 한다. 이때, 필요한 감독관 수의 최솟값을 구하는 프로그램을 작성하시오.
2. 접근 방식
그냥 기본 수학문제다 ! 어려운 건 없다. 다만 자바로 풀때는 long형으로 출력해주어야 한다는 점 !
3. 주석 달기 (변수 설명, 각 줄마다 문장으로 설명, 함수 설명)
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static FastReader scan = new FastReader();
static long[] student;
static int n;
static long head, manager, cnt = 0;
public static void main(String[] args) {
n = scan.nextInt();
student = new long[n];
for(int i = 0; i < n; i++) {
student[i] = scan.nextInt();
}
head = scan.nextInt();
manager = scan.nextInt();
for(int i = 0; i < student.length; i++) {
student[i] = Math.max(0, student[i]-head);
cnt++;
}
for(int i = 0; i < student.length; i++) {
if(student[i] < 1) continue;
long number = student[i] / manager;
cnt += number;
if(student[i] % manager != 0) cnt++;
student[i] = 0;
}
System.out.println(cnt);
}
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public FastReader(String s) throws FileNotFoundException {
br = new BufferedReader(new FileReader(new File(s)));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
}
4. 분석 및 시간복잡도
시간복잡도 : O(N)