Q 13458 시험 감독
💡 문제 요약 및 분석
시험장 N 개와 각 시험장의 응시자 수 A 가 주어졌을 때 필요한 총감독(B명 감시), 부감독(C명 감시) 인원을 구하면 된다.
💡 알고리즘 설계
✅ 핵심 아이디어 : 총감독은 무조건 1명이므로 ‘응시자 수 - B’, 부감독 수는 ‘남은 응시자 수 / C’ 의 몫을 올림하면 구할 수 있다.
입력
- 시험장 개수(int)
- 응시자 수(int[])
- 총감독, 부감독 감시 인원(int)
연산
- 시험장 개수만큼 반복한다. (최대 1,000,000번 반복)
- 응시자 수 배열에서 i 번째 시험장의 응시자 수(num)를 가져온다.
- (num - b / c) 값의 소수점 밑을 올림하면 부감독의 수. (누적합)
- 시험장 하나 당 총감독 1명은 무조건 배정된다. (누적합)
출력
- 누적합한 count 변수를 출력한다.
💡 코드
public class Main {
static int read() throws Exception {
int c, n = System.in.read() & 15;
while ((c = System.in.read()) > 47) n = (n << 3) + (n << 1) + (c & 15);
return n;
}
public static void main(String[] args) throws Exception {
int n = read();
double[] rooms = new double[n];
for (int i = 0; i < n; i++) {
rooms[i] = read();
}
double b = read();
double c = read();
int count = 0;
for (int i = 0; i < n; i++) {
double temp = rooms[i] - b;
count++;
if (temp == 0 || temp < 0) continue;
double num = temp / c;
int result = (int) Math.ceil(num);
count += result;
}
System.out.println(count);
}
}
💡 틀린 부분 분석
자료형 때문에 틀렸다. 시험장이 최대 100만개, 교실 하나 당 응시자 수가 100만명으로 최대로 가정하고, 감독관이 감독할 수 있는 인원을 최소 인원 1명씩으로 잡아 생각해보면 교실 하나에 필요한 감독관의 수는 최악의 경우 100만명이 되는데, 시험장이 100만개가 있으므로 이를 곱하면 수십억이 된다. int 의 범위는 21억이기 때문에 이를 초과할 수 있어 틀렸다. 이 경우 간단하게 count 변수를 long 으로 바꾸면 해결된다.
💡 시간 복잡도, 공간 복잡도
시간 복잡도 | 공간 복잡도 |
---|---|
O(n) | O(n) |
💡 느낀점 및 기억할 정보
- 범위 확인 : 지난번 경험으로 문제에서 2초 라는 시간이 주어졌을 때 2억번의 연산을 넘지 않도록 하면 통과할 수 있겠다고 생각했는데, 자료형의 범위를 잊었다… 구현하기 전에 범위에 대한 것을 체크한 것은 좋았지만 ! 자료형까지도 꼼꼼히 파악하자 !