본문 바로가기
Algorithms/코테 문풀

백준[13458번] 시험 감독 문풀 - Python

by hi-rachel 2022. 10. 12.
문제

N개의 시험장이 있고, 각각의 시험장마다 응시자들이 있다. i번 시험장에 있는 응시자의 수는 Ai명이다.

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

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

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

 

입력

첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다.

셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)

 

출력

각 시험장마다 응시생을 모두 감독하기 위해 필요한 감독관의 최소 수를 출력한다.

 

문제 풀이

비전공자로 최근 백준 문제를 거의 처음 풀어보는데, 이 문제만 이해하는데 오래걸렸다.

간단히 이해할 수 있는 분 말고 자세한 설명이 필요하신 분만 다 읽어보시길!

 

※ 문제 해석

exam_place = int(input('시험장의 개수를 입력하시오.\n'))
students = list(map(int, input('각 시험장별 응시 학생 수를 입력하시오.\n').split()))
B, C = map(int, input('총감독관, 부감독관이 관리할 수 있는 학생 수를 각각 입력하시오.\n').split())
# B는 총감독관, C는 부감독관

헷갈려서 input 내용을 적어놓았다.

시험장의 개수, 각 시험장별 응시 학생 수, 총/부 감독관들이 관리할 수 있는 학생 수를 Input으로 입력받는다.

+) 총/부 감독관들이 관리할 수 있는 학생 수를 직접 정해준다.

총 감독관은 반드시 각 시험장마다 1명씩 있어야 하므로 1명 이상의 학생은 관리한다. (1 ≤ B, C ≤ 1,000,000)

 

exam_superviser_minimum = exam_place

최소 감독관 수를 일단 시험장의 개수로 할당한다(최소 조건)

ex_ 5개의 시험장이면 총감독관은 1명이상 필수로 존재하므로 일단 최소 감독관 5명

 

for i in range(exam_place):
  temp = students[i] - B
  if temp > 0:
    temp1 = temp // C
    temp2 = temp % C
    if temp2 > 0:
      temp2 = 1

    exam_superviser_minimum += temp1 + temp2

print(exam_superviser_minimum)

반복문을 이용해 각 시험장별 최소 감독수를 구해 모두 더한다.

   temp 변수에 일단 각 시험장별 학생 수에서 총감독관이 1명 관리할 수 있는 응시자 수(최소 조건 충족)를 빼서 할당한다.

   관리할 학생 수가 남았다면(if temp > 0)

      temp1에 temp를 부감독관이 관리하는 학생 수를 나누어 할당한다. = 필요한 부감독관의 수

      temp2에 temp를 부감독관이 관리하는 학생 수를 나눈 나머지를 할당한다.

         => 나머지가 0이 아니라면 최소 더 필요한 감독 수 + 

// 이 부분을 이해하는데 오래걸렸는데

결국 <최소 한명이 필요한 총감독자 수 + 필요한 부감독관 수 + 나머지가 남으면 감독관 한명 추가>이다.

 

- 전체 코드

exam_place = int(input('시험장의 개수를 입력하시오.\n'))
students = list(map(int, input('각 시험장별 응시 학생 수를 입력하시오.\n').split()))
B, C = map(int, input('총감독관, 부감독관이 관리할 수 있는 학생 수를 각각 입력하시오.\n').split())
# B는 총감독관, C는 부감독관

exam_superviser_minimum = exam_place
    
for i in range(exam_place):
  temp = students[i] - B
  if temp > 0:
    temp1 = temp // C
    temp2 = temp % C
    if temp2 > 0:
      temp2 = 1

    exam_superviser_minimum += temp1 + temp2

print(exam_superviser_minimum)

        

- 백준 제출용 간단 버전

exam_place = int(input())
students = list(map(int, input().split()))
B, C = map(int, input().split())

exam_superviser_minimum = exam_place
    
for i in range(exam_place):
  temp = students[i] - B
  if temp > 0:
    temp1 = temp // C
    temp2 = temp % C
    if temp2 > 0:
      temp2 = 1

    exam_superviser_minimum += temp1 + temp2

print(exam_superviser_minimum)

 

문제 출처

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

 

오래걸려도 이해하고 넘어가자!