📌 문제
총 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)
📌 출력
각 시험장마다 응시생을 모두 감독하기 위해 필요한 감독관의 최소 수를 출력한다.
📌 문제 풀이
👨🏫 접근
삼성 SW 역량 테스트 기출 문제여서 어려운 문제일 줄 알았는데, 막상 풀고 나니까 쉬웠던 문제.
일단 각 시험관에는 총 감독관이 최소 1명이 있어야 하며, 부 감독관은 몇 명이 있든 상관 없다. 그래서 초기 ans 변수에 문제에서 주어진 n을 집어넣었다.
그 다음, 각 시험장에 필요한 부 감독관을 배치해야 하는데, 이는 총 감독관이 감독할 수 있는 인원을 제외한 다음, 제외된 인원으로부터 몇 명의 부 감독관이 필요한지 계산해야 한다.
입력 예제 중에서
5
100000 100000 100000 100000 100000
5 7
이런 입력이 주어졌는데, 일단 각 시험장마다 한 명의 총 감독관이 존재하기 때문에 미리 값을 갱신해준다.
5
999995 999995 999995 999995 999995
5 7
ans = 5
그 다음 여기서 각 시험장에 대해 연산을 해준다. 먼저 몫 연산자를 통해서 주어진 인원을 모두 나누어준다. 그러면 어떨 때는 나머지 없이 계산이 될 것이고, 어떨 때는 나머지가 있는 채로 계산이 될 것이다.
예제의 경우 999995를 7로 나누었을 때, 3의 나머지가 발생한다. 그러면 이 3명은 감독관이 없어야 할까? 아니다. 그래서 만약 나머지가 존재하는 경우에는 1을 더하고, 그렇지 않은 경우는 0을 더한다.
👨🏫 문제 풀이
📄 전체 코드
n = int(input())
a = list(map(int, input().split()))
b, c = map(int, input().split())
ans = n
def solve(k):
num = k - b
if num <= 0:
return 0
else:
count = num // c
mod = 1 if num % c else 0
return count + mod
ans += sum(list(map(solve, a)))
print(ans)
📄 준비
n = int(input())
a = list(map(int, input().split()))
b, c = map(int, input().split())
ans = n
미리 총 감독관 만큼 수를 저장해 놓는다.
📄 풀이
def solve(k):
num = k - b
if num <= 0:
return 0
else:
count = num // c
mod = 1 if num % c else 0
return count + mod
ans += sum(list(map(solve, a)))
print(ans)
여기서는 map 함수를 사용했다. map 함수를 사용해 미리 필요한 연산은 모든 배열에 수행하고 그 다음 sum 함수로 값을 갱신했다.
📌 총평
쫄지 말자.
'Algorithm > Math' 카테고리의 다른 글
[Python - Math] 1978 소수 찾기(에라토스테네스의 체) (0) | 2022.08.05 |
---|---|
[Python] 5347 LCM (0) | 2022.06.24 |
[Python] 1929 소수 구하기 (0) | 2022.06.23 |