[java,백준13458]시험 감독 - 수학적 접근
각 시험장별 필요한 감독관 수를 계산하여 최소 감독관 수를 구하는 수학적 접근 문제입니다.
예시 시각화:
N = 5 (시험장 수)
응시자 수: 10 9 10 9 10
B = 7 (총감독관 감시 인원)
C = 2 (부감독관 감시 인원)
시험장별 감독관 배치 과정:
1번 시험장(10명 응시자) → 총감독관1명 (7명 응시자) + 부감독관2명 (4명 응시자) = 3명 필요
┌─────────┐
│ 👥👥👥👥👥 │
│ 👥👥👥👥👥 │
│ 👨1(총감) 👨2(부감) │
└─────────┘
2번 시험장(9명 응시자) → 총감독관1명 (7명 응시자) + 부감독관1명 (2명 응시자) = 2명 필요
┌─────────┐
│ 👥👥👥👥 │
│ 👥👥👥👥👥 │
│ 👨1(총감) 👨1(부감) │
└─────────┘
...이하 동일한 방식으로 계산
풀이
구현 시 주의사항
💡 단순해 보이는 문제지만 오버플로우 처리가 매우 중요! (long 사용하자)
입력값이 큰 경우 int 범위를 벗어날 수 있기 때문! (실제로 벗어난다!)
💡 총감독관 1명을 먼저 배치한 후, 부감독관을 필요한 만큼 추가하는 방식으로 구현 (수학적 계산)
핵심 구현 사항
- long 자료형 사용 필수
- B,C가 1이고 N,A가 백만인 경우
백만*백만
으로 int범위를 벗어남
- B,C가 1이고 N,A가 백만인 경우
- 총감독관은 반드시 1명씩 배치
- 문제의 요구사항임
- 부감독관은 남은 인원에 따라 계산
총감독관 배치
for (int i = 0; i < N; i++) {
input[i] -= B;
result++;
if(input[i] < 0) input[i] = 0;
}
부감독관 배치
for (int i = 0; i < N; i++) {
if (input[i] % C == 0) {
result += input[i]/C;
} else {
result += (input[i]/C + 1); //수학적으로 나머지 있을 때 +1 요함
}
}
전체 코드
public class 시험감독_13458 {
static int N, B, C;
static int[] input;
static long result;
public static void main(String[] args) throws IOException {
input();
solve();
System.out.println(result);
}
private static void solve() {
result = 0;
for (int i = 0; i < N; i++) {
input[i] -= B;
result++;
if(input[i] < 0) input[i] = 0;
}
for (int i = 0; i < N; i++) {
if (input[i] % C == 0) {
result += input[i]/C;
} else {
result += (input[i]/C + 1);
}
}
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
input = new int[N + 1];
StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
input[i] = Integer.parseInt(stk.nextToken());
}
stk = new StringTokenizer(br.readLine(), " ");
B = Integer.parseInt(stk.nextToken());
C = Integer.parseInt(stk.nextToken());
}
}
주관적인 생각의 풀이이므로 틀린 부분 지적은 언제나 환영합니다⚡
댓글남기기