Algorithm/Math

[Python - Math] 13458 시험 감독

턴태 2022. 10. 7. 15: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)

📌 출력

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

📌 문제 풀이

👨‍🏫 접근

삼성 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 함수로 값을 갱신했다.

📌 총평

 

쫄지 말자.