알고리즘/BOJ
[ 백준 13458 시험 감독 ] 문제 풀이(Java) - 삼성SW역량테스트 기출
myeongmy
2020. 4. 8. 20:33
반응형
처음에 이 문제를 보고
브론즈 2레벨인데 왜 정답률이 25%밖에 안돼지?라고 생각했는데 실수하기 쉬운 부분이 있었습니다!
문제보기
https://www.acmicpc.net/problem/13458
13458번: 시험 감독
첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)
www.acmicpc.net
나의 풀이
수학 나머지 연산(%)을 이용하면 간단하게 풀 수 있습니다.
(총감독관 수 + 부감독관 수)가 최소가 되어야 합니다. 일단 총감독관 수는 모든 방에 1명씩 있어야 하므로 총 감독관 수는 모든 방의 개수 이상이 될 수 밖에 없습니다.
그렇기 때문에 모든 방의 인원에서 총 감독관이 감독할 수 있는 인원(B)를 빼주고 나머지 인원에 대해 부 감독관 수를 구해주면 됩니다!
★ 실수하기 쉬운 포인트 ★
1. 감독관 수는 long으로 선언하여야 한다.
(틀렸습니다 뜨면 long으로 바꾸는 것을 먼저 생각하자,,,,)
2. 방의 인원보다 총 감독관이 감독할 수 있는 인원(B)가 더 큰 경우가 존재한다.
코드
//수학 문제
import java.io.*;
public class N_13458 {
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
int N = Integer.parseInt(br.readLine()); // 시험장의 개수
int[] A = new int[N];
String[] arr = br.readLine().split(" ");
for (int i = 0; i < N; i++)
A[i] = Integer.parseInt(arr[i]);
String[] arr1 = br.readLine().split(" ");
int B = Integer.parseInt(arr1[0]);
int C = Integer.parseInt(arr1[1]);
long numSupervisor = A.length; // 모든 방마다 총감독관 1명은 무조건 필요하니까
for (int i = 0; i < N; i++) {
if (A[i] <= B)
continue;
if ((A[i] - B) % C != 0)
numSupervisor++;
numSupervisor += ((A[i] - B) / C);
}
System.out.println(numSupervisor);
} catch (IOException e) {
e.printStackTrace();
}
}
}
결과
반응형