ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 13458번 시험감독
    C++ 2021. 12. 11. 22:09

    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

    계속 틀리길래 뭐가 문제인가 구글링 해봤는데, 자료형 문제였다. 

    그리고 cmath에서 ceil 함수 사용해서 굳이 메인감독관만 필요한 경우를 처리할 필요 없다고 생각했는데 안하면 백준 사이트에서 채점시 오류가 발생한다. 이런 자잘한 조건들 때문에 쉬운 문제인 편이지만 정답률이 낮은 편인듯..?


    < 코드 작성 전 정리 >

    - 고사장 수, 학생 수는 100,0000까지 가능인데 총 감독관, 부 감독관의 최소 감시 가능 숫자는 1이다. 즉 최종 결과 sum의 값이 int형 범위를 넘는 경우가 생길 수 있다. => long long 사용하자... 구글링으로 깨달았다...

    - 총 감독관 1명으로도 충분한 경우가 있을 수 있다. 그 부분 처리 잘 할 것


    < 전체 코드 >

    처음에는 감독관 수 구하는 부분을 함수로 쪼개놨었다. 함수로 빼지말고 else문에 넣어서 채점해보니까 4ms정도 단축이 되길래 이 코드로 기록해두기로 ... 

    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    int main() {
        int n, students, main_num, sub_num; 
        long long sum = 0;
        cin>>n;
        vector <int> classes;
        for(int i = 0; i < n; i++) {
            cin>>students;
            classes.push_back(students);
        }
        cin>>main_num>>sub_num;
        for(int i = 0; i < n; i++) {
            if (classes[i] <= main_num) {
                sum++;
            }
            else {
                sum += 1 + ceil((double)(classes[i] - main_num) / sub_num);
            }
        }
        cout<<sum;
    }

    < 각 코드별 부연설명 >

     

    #1 ) 헤더파일

    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;

    - ceil() 함수 사용을 위해 cmath 헤더를 호출

     


    #2 ) 입력 받는 부분

    int main() {
        int n, students, main_num, sub_num; 
        long long sum = 0;
        cin>>n;
        vector <int> classes; // 각 고사장의 학생 수 저장할 벡터
        for(int i = 0; i < n; i++) {
            cin>>students;
            classes.push_back(students);
        }
        cin>>main_num>>sub_num;

    n : 고사장 수 (1~100,0000)

    students : 각 고사장별 학생 수 (1~100,0000)

    main_num : 총 감독관이 감독 가능한 학생 수

    sub_num : 부 감독관이 감독 가능한 학생 수

    sum : 필요한 감독관들의 수 long long으로 해야한다. main_num과 sub_num이 모두 1이라면 필요한 감독관 수가 int범위를 넘어가기 때문이다. 


    #3 ) 필요한 감독관 수 계산

    for(int i = 0; i < n; i++) {
            if (classes[i] <= main_num) {
                sum++;
            }
            else {
                sum += 1 + ceil((double)(classes[i] - main_num) / sub_num);
            }
        }

    - if 문에 걸리는 경우는 총 감독관 혼자서 고사장 내 학생 모두를 감시할 수 있는 경우이다. 이 경우는 총 감독관 1명만 필요하므로, sum ++만 하면 된다. 

    - else문에 걸리는 경우는 부 감독까지 필요한 경우이다. 이 때 학생이 1명이라도 남으면 무조건 부감독 1명이 필요하기 때문에 ceil함수를 사용하는데, double로 강제 자료형 변환을 해줘야한다. 그러지 않으면 int로 선언했기 때문에 3 / 2 = 1로 계산되기 때문이다. 

    - else문에서도 총 감독관은 무조건 1명 필요하므로 +1 해준다. 

     

Designed by Tistory.