문제
총 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이 아니라면 최소 더 필요한 감독 수 + 1
// 이 부분을 이해하는데 오래걸렸는데
결국 <최소 한명이 필요한 총감독자 수 + 필요한 부감독관 수 + 나머지가 남으면 감독관 한명 추가>이다.
- 전체 코드
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
오래걸려도 이해하고 넘어가자!
'Algorithms > 코테 문풀' 카테고리의 다른 글
백준[2438, 2439번] 별 찍기 - 1,2 문풀 (Python) (0) | 2022.10.25 |
---|---|
백준[3003번] 킹, 퀸, 룩, 비숍, 나이트, 폰 문풀 - Python / print options (1) | 2022.10.13 |
백준[10699번] 오늘 날짜 문풀 - Python (0) | 2022.10.10 |
백준[11022번] A+B - 8 - Python (0) | 2022.10.10 |
백준[11021번] A+B - 7 문풀 - Python (0) | 2022.10.10 |