출처: https://www.acmicpc.net/problem/13458
문제를 읽어 보면 그리디 문제라는 것을 알 수 있다.!!
N 개의 시험장과 각 시험장에 응시하는 인원이 주어진다.
그다음에는 총감독관과 부감독관이 감시할 수 있는 인원이 주어진다
문제 조건에서 각 방마다 총감독관은 1명이 있어야 하고 부감독관은 여러 명 있어도 된다!
!! 주의할 점은 총 감독할 수 있는 인원의 최솟값이 너무 커질 수가 있기 때문에 결괏값을 int 형이 아닌 long 형으로 설정해야 한다
//long!!!
long sum = 0;
나는 각 방의 인원을 num이라는 배열에 담아주었다. 그리고 각방에서 필요한 감독관의 최소인원을 더해나가는 식으로 풀었다 각방에서 총감독관의 인원은 적어도 1 명이 필요하므로 필요한 감독관의 최소인원을 1 늘려준다 그 후
만약 i 번째 방의 응시생( num [i] )에서 총감독관이 감시 가능 한인원(num _ main)을 빼준값이 0 보다 크다면
나머지 인원들은 부감독관이 감시하도록 하면 된다.
sum ++;
if(num[i] - num_main > 0) {
sum +=Math.ceil(1.0 * (num[i] - num_main)/ num_sub);
}
자바는 int 형끼리 나눗셈 계산 시 나머지를 내림해서 정수형으로 반환한다!!! 그렇기 때문에 나는
Math.ceil()을 이용해 올림을 해주었고 int 형을 double 형으로 형 변환해주기 위해여 1.0을 곱해주었다.!
예를 들어 : 감시 가능한 인원 총감독관 : 3, 부감독관 : 3
4번 방의 인원이 10명이었는데 총감독관이 감시 가능한 인원이 3명이라 나머지 7명을 부감독관이
감시해야 한다면 7 / 3 = 2.3333.... 이기 때문에 총 3명이 필요하다.
다음은 전체 코드이다.
public class Baekjoon_13458 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] num = new int[n];
for(int i = 0; i < n; i++) {
num[i] = sc.nextInt();
}
int num_main = sc.nextInt();
int num_sub = sc.nextInt();
//long!!!
long sum = 0;
for(int i = 0; i < n; i++) {
sum ++;
if(num[i] - num_main > 0) {
sum +=Math.ceil(1.0 * (num[i] - num_main)/ num_sub);
}
}
System.out.println(sum);
}
}
sw 기출치고는 쉬운 문제였지만 아마도 int 형으로 최소인원값을 설정하고 체출을 계속해서 정답 비율이 많이 낮았던거 같다.
'SW 역량 테스트' 카테고리의 다른 글
백준_17142_연구소3 (0) | 2020.05.10 |
---|---|
백준_15683_감시 (0) | 2020.03.07 |
백준_14501_퇴사 (0) | 2020.03.04 |
백준_14899_스타트와링크 (0) | 2020.03.04 |