BOJ [Bronze II] 시험 감독 - 13458

다히·2023년 2월 2일
0

BOJ

목록 보기
30/45

문제 링크

분류

사칙연산(arithmetic), 수학(math)

문제 설명

총 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)

5
1000000 1000000 1000000 1000000 1000000
5 7

출력

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

714290


내 코드

n = int(input())
a = list(map(int, input().split()))
b, c = map(int, input().split())
result = n

tmp = [i-b for i in a if i-b > 0]
for i in tmp:
    if i%c == 0:
        result += i//c
    else:
        result += (i//c + 1)
print(result)
  • 문제에서 살짝 헷갈릴 수 있었던 게 각각의 시험장에 총감독관은 오직 1명만 있어야 하고 인데, 이 말은 그냥 각 시험장에 총감독관이 무조건 1명 있어야 한다는 소리임 더도 말고 덜도 말고 딱 한 명!

  • 그거에서 꼬아서 생각만 안 하면 쉽게 풀리는 문제 .. 정답 비율이 낮길래 쫄았는데 저기서 틀린 걸까 다들??

  • 어차피 총감독관이 시험장마다 있어야 하니까 result를 시험장 개수로 초기화 해줬고,

    총감독관이 관리할 수 있는 인원을 각 시험장에서 빼준 리스트를 별도로 저장하는데, 총감독관만으로도 감독이 되는 경우(B를 뺐을 때 0보다 작은 경우)는 제외하고 저장함

  • 굳이 이렇게 안 하고 for문 안에 i -= B 하고, i > 0 인 경우에 대해서만 C로 나누는 경우를 챙겨주면 되긴 하지만 시간 복잡도 계산했을 때 무리 없길래 그냥 리스트 컴프리헨션으로 미리 처리해줬음

  • print(sum(1 + max(0, a - B + C - 1) // C for a in A)) 로 한 방에 쓴 사람도 있던데 신기하다 .......... max(0, a - B + C - 1) // C가 바로 떠오를까 이사람은?????

0개의 댓글