알고리즘/시뮬레이션

[백준 13458 : PYTHON] 시험 감독

cijbest 2021. 6. 13. 21:57

문제 풀기 : 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

문제

총 N개의 시험장이 있고, 각각의 시험장마다 응시자들이 있다.

총감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 B명이고, 부감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 C명이다.

각각의 시험장에 총감독관은 오직 1명만 있어야 하고, 부감독관은 여러 명 있어도 된다.

각 시험장마다 응시생들을 모두 감시해야 한다. 이때, 필요한 감독관 수의 최솟값을 구하는 프로그램을 작성하라.

 

문제풀이

각각의 시험장의 감독관을 정할 때 총감독관을 먼저 배치한다. 총감독관이 감시할 수 있는 사람(B)을 시험장에 있는 사람을 다 커버할 수 있으면 감독관 수를 증가시키고 커버할 수 없으면 부감독관의 수를 구한다. 부감독관은 남은 사람들에서 부감독관이 감독할 수 있는 사람(C)만큼 나눈다. 나머지가 0이면 나눈 몫만큼이 부감독관 수가 되고 나머지가 0이 아니면 나눈 몫에 부감독관 한명을 더 추가시킨 것이 부감독관의 수가 된다.

예) 시험장 사람 : 15명, 부감독이 감시할 수 있는 사람 : 4 일때,

     15 / 4 = 3(몫)...3(나머지)

     필요한 부감독수 : 4명

 

전체코드

import sys
sys.stdin.readline

# INPUT
N = int(input())
data = list(map(int, input().split()))
B, C = map(int, input().split())

# 감독관 수
cnt = 0

for d in data:
    # 총감독이 감독할 수 있는 사람 빼기
    d -= B
    # 아직 감독해야할 사람이 있는 경우
    if d > 0:
        # 부감독관이 감독할 수 있는 사람이 딱 떨어지는 경우(총감독관 1명 포함)
        if (d/C) == int(d/C):
            cnt += 1 + (d/C)
        # 부감독관이 감독할 수 있는 사람보다 조금 더 있는 경우(총감독관 1명 포함)
        else:
            cnt += 1 + int(d/C) + 1
    # 총감독만으로 시험장 감독이 가능한 경우
    else:
        cnt += 1
        
print(int(cnt))
반응형