[코드트리] 바이러스 검사

Jimeaning·2023년 8월 29일
0

코딩테스트

목록 보기
120/143

Python3

문제

바이러스 검사

키워드

  • 그리디

문제 풀이

문제 요구사항

  • 총 n개의 식당에서 체온을 측정하는 검사자는 검사팀장과 검사팀원으로 나뉘어진다.
  • 한 가게당 팀장은 오직 한 명, 팀원은 여러 명이 있을 수 있다. (하지만 가게당 팀장 한 명은 무조건 필요.)
  • 팀장이든 팀원이든 담당한 가게에 대해서만 검사한다.
  • n개의 식당 고객들의 체온을 측정하기 위해 필요한 검사자 수의 최솟값을 구하는 프로그램

변수 및 함수 설명

  • n: 식당의 수
    1 ≤ n ≤ 1,000,000
  • cust: 각 식당에 있는 고객의 수
    1 ≤ (각 식당에 있는 고객의 수) ≤ 1,000,000
  • ldr: 검사팀장이 검사할 수 있는 최대 고객 수
  • mbr: 검사팀원이 검사할 수 있는 최대 고객 수
    1 ≤ (팀장 혹은 팀원 한 명이 검사 가능한 최대 고객의 수) ≤ 1,000,000
  • ans: n개의 식당의 고객들을 모두 검사하기 위한 검사자의 최소의 수
  • tmp: 검사팀장이 검사할 수 있는 고객 수를 제외한 남은 고객

풀이

  • 식당, 고객, 검사팀장과 팀원이 검사할 수 있는 고객 수를 입력받는다.
  • ans 변수에 식당 개수만큼 넣는다. (식당 하나당 한 명의 검사팀장이 들어가야 하기 때문)
  • 식당 개수만큼 반복한다
  • 검사팀장이 검사할 수 있는 고객 수를 제외한 남은 고객을 tmp 변수에 저장한다.
  • 만약 식당에 남은 인원이 더이상 없다면, 검사팀장으로 이미 검사가 끝난 것이기 때문에 더 계산할 필요가 없다. -> continue
    (참고: break를 하게 되면 다른 식당까지도 종료되기 때문에 안 됨)
  • 만약 팀원이 남은 인원을 모두 검사할 수 있다면, 최종 출력값에 1을 더한다.
  • 그렇지 않으면, 남은 인원이 팀원이 검사할 수 있는 양으로 나눠질 때와 그렇지 않을 때로 나뉜다.
    - 만약 나누어 떨어진다면, 남은 인원에서 팀원이 검사할 수 있는 인원으로 나눈 몫을 최종값에 누적한다.
    - 그렇지 않으면 몫 + 1한 값을 누적한다.
  • 최종 ans 변수를 출력한다.

최종 코드

n = int(input())
cust = list(map(int, input().split()))
ldr, mbr = map(int, input().split())

ans = n

for i in range(n):
    tmp = cust[i] - ldr
    if tmp <= 0:
        continue
    if mbr > tmp:
        ans += 1
    else:
        if tmp % mbr == 0:
            ans += tmp // mbr
        else:
            ans += tmp // mbr + 1

print(ans)

피드백

profile
I mean

0개의 댓글