본문 바로가기
Python/백준

백준 시험 감독 [13458] Python 코드 + 해설

by Guardy 2024. 10. 22.
728x90

백준 13458 시험감독 문제

이 문제에서는 여러 시험장이 있고, 각 시험장마다 응시자의 수가 주어진다. 각 시험장에는 반드시 총감독관이 1명 있어야 하며, 총감독관은 최대 B명의 응시자를 감독할 수 있다. 추가로 필요한 경우 부감독관을 여러 명 배치할 수 있으며, 부감독관 한 명은 최대 C명의 응시자를 감독할 수 있다.

모든 응시생을 감독하기 위해 필요한 최소한의 감독관 수를 계산하는 것이다.

해결 방법: 수학적 계산을 통한 최적화

이 문제는 각 시험장마다 필요한 감독관의 수를 계산하여 합산하면 된다. 중요한 점은 각 시험장마다 반드시 총감독관이 1명 있어야 한다는 것이다.

구현 단계

  1. 입력 받기
    • 시험장의 수 N과 각 시험장마다의 응시자 수 A_i를 입력받는다.
    • 총감독관이 감독할 수 있는 응시자 수 B와 부감독관이 감독할 수 있는 응시자 수 C를 입력받는다.
  2. 필요한 감독관 수 계산
    • 각 시험장마다 다음을 수행한다:
      • 총감독관이 감독할 수 있는 응시자 수 B를 응시자 수 A_i에서 빼준다.
      • 남은 응시자 수가 0 이하이면 총감독관 1명만 필요하다.
      • 남은 응시자 수가 0보다 크면 부감독관이 필요하다.
        • 필요한 부감독관의 수는 (남은 응시자 수) / C를 올림한 값이다.
      • 해당 시험장에서 필요한 감독관의 총 수는 1(총감독관) + 부감독관 수이다.
  3. 총 감독관 수 합산
    • 모든 시험장에서 필요한 감독관 수를 합산하여 최종 결과를 출력한다.

 

정답 코드(Python)

import sys
import math

def main():
    N = int(sys.stdin.readline())
    A = list(map(int, sys.stdin.readline().split()))
    B, C = map(int, sys.stdin.readline().split())
    total_supervisors = 0

    for candidates in A:
        # 총감독관 한 명 배치
        total_supervisors += 1
        remaining = candidates - B

        if remaining > 0:
            # 부감독관 수 계산 (올림)
            total_supervisors += math.ceil(remaining / C)

    print(total_supervisors)

if __name__ == "__main__":
    main()

코드 설명

  • 입력 처리
    • sys.stdin.readline()을 사용하여 입력을 효율적으로 받는다.
    • 응시자 수 리스트 A와 감독관의 능력 B, C를 입력받는다.
  • 감독관 수 계산
    • 총감독관은 반드시 1명 배치하므로 total_supervisors += 1을 해준다.
    • 응시자 수에서 총감독관이 감독할 수 있는 수 B를 빼고 남은 응시자 수를 계산한다.
    • 남은 응시자 수가 0보다 크면 부감독관이 필요하므로 부감독관의 수를 계산한다.
      • math.ceil(remaining / C)를 사용하여 올림 처리한다.
  • 최종 결과 출력
    • 모든 시험장에 대한 감독관 수를 합산하여 출력한다.

문제 해결

도움이 되셨다면 공감 및 댓글 부탁드립니다.

728x90