2 minute read



문제 풀이


이번 문제는 사칙 연산을 통해 간단하게 풀 수 있는 문제이다.


아이디어 도출

바로 문제 풀이를 위한 아이디어를 살펴보자.

  1. 먼저 응시장 별로 최소 총 감독관이 N명만큼 필요하기에 필요한 감독관의 수를 N으로 두고 시작한다.
  2. 반복문을 통해 응시장별 응시자 수에서 총 감독관이 감독할 수 있는 수(B)만큼 차감한다.
  3. 총 감독관의 감독 수만큼 차감한 후 응시장 별 응시자 수가 0 이하라면 부감독관이 필요없기에 다음 순회로 넘어간다.
  4. 응시장별 응시자 수마다 부감독관이 감독할 수 있는 수(C)로 나눈만큼 부감독관 수가 필요하기에 나눈 값을 감독관 수에 더해준다.
  5. C로 나눈 나머지가 0이 아니라면, 부감독관이 추가적으로 1명 더 필요하기에 감독관 수에 1을 더해주면 된다.

위와 같이 나눗셈과 나머지를 잘 유의하면 풀면 쉽게 풀 수 있다.

또한 감독관의 수는 시험장의 개수와 학생 수를 고려해 int형이 아닌 long형으로 선언하여 풀어야 한다.


문제 풀이를 위해 작성한 코드는 아래와 같다.

작성코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.io.*;
import java.util.*;

class Main {    

    public static void main(String[] args) throws IOException {

        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
                
                // 응시장 개수
                int N = Integer.parseInt(br.readLine());
                
                // 응시장 별 응시자 수를 담을 배열 선언 후 입력받음.
                int[] candidates = new int[N];

                StringTokenizer st = new StringTokenizer(br.readLine());
                for(int i=0; i<N; i++) {
                    candidates[i] = Integer.parseInt(st.nextToken());
                }

                // 총 감독관이 감독할 수 있는 수 B와 부 감독관이 감독할 수 있는 수 C 입력받음.
                st = new StringTokenizer(br.readLine());
                int B = Integer.parseInt(st.nextToken());
                int C = Integer.parseInt(st.nextToken());

                // 감독관 수는 총 N개에 응시장에 총 감독관이 최소 1명씩 배치되므로 N부터 시작한다.
                // 시험장의 개수와 학생 수가 최대 1,000,000이기에 int형이 아닌 long형으로 선언해야 한다.
                long viewerCnt = 0;
                viewerCnt += N;

                /**
                 * 1. 먼저, 총 감독관이 감시할 수 있는 수를 차감한다. 이때, 각 응시장별로 0명 이하라면, 부감독관이 필요 없기에 continue한다.
                 * 2. 0명 이상이라면, 부감독관이 필요하기 때문에 응시장 별 남은 응시자 수를 C로 나눈 값만큼을 감독관 수로 늘린다.
                 * 3. 이후 응시장별 남은 응시자 수를 C로 나눈 나머지가 0이 아니라면 추가적으로 부감독관이 필요한 것이기에 마지막으로 감독관 수를 1 늘린다.
                 */
                for(int i=0; i<N; i++) {
                    candidates[i] -= B;
                    if(candidates[i] <= 0) {
                        continue;
                    }
                    viewerCnt += candidates[i] / C;
                    if(candidates[i] % C != 0) {
                        viewerCnt++;
                    }
                }
                bw.write(viewerCnt+"\n");           
        }
    }
}

출처


  • 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.