jyamethyst21 님의 블로그

백준 13458번- '시험 감독' (PYTHON 풀이) 본문

CODING 💻

백준 13458번- '시험 감독' (PYTHON 풀이)

jyamethyst21 2025. 12. 25. 00:12

문제:

 

시험장 개수, 각 시험장의 응시자 수, 총감독관 및 부감독관 한명이 각각 맡을 수 있는 응시자 수를 입력받고 응시자 수에 따라서 전체 감독관의 수가 어떻게 되는지 출력하는 문제이다.

즉, 예를 들어 1개의 시험장에 응시자 수가 10명이고, 총감독관 1명은 5명, 부감독관 1명은 3명을 맡을 수 있다면 10(응시자 수) - 5(총감독관 수, 1명만 가능하니까 -5) - 3(부감독관) - 2(부감독관) = 0 이 되어서 총 3명이 출력되어야 한다.

 

풀이:

N = int(input())
A = list(map(int,input().split()))
B, C = map(int,input().split())
count = 0

for i in A:
    count += 1
    i -= B

    if i > 0:
        k = (i + C - 1) // C
        count += k
        
print(count)

일단 입력받는 부분에 대한 설명은 생략하도록 하겠다.

그리고 전체 감독관 수를 출력하는 변수를 0으로 초기화하고 각 방에 대한 응시자 수를 반복문을 통해 하나씩 돌면서, 총감독관에 대한 카운트 수를 1 늘려주고 총감독관이 맡을 수 있는 응시자 수를 전체 응시자 수에서 빼준다. 이 작업은 한번만 진행한다. 왜냐하면 총감독관은 각 방마다 딱 한명만 존재하기 때문이다.

그리고 만약 응시자 수가 총감독관 수의 계산 이후에도 남아있다면, 이는 부감독관을 통해 관리가 되어야 하기 때문에 (i+C-1) // C를 통해 감독관 수를 구하고 이를 count에 증가시킨다.

 

(i+C-1) // C 식을 활용하는 이유는 다음과 같다.

일단 남아있는 응시자 수에 대해 한명이 최대 C명까지 담당할 수 있을 때 필요한 인원 수는 응시자 수(i) / C를 올림한 값이다. 예를 들어 응시자 수가 5명, C가 2일 때 2.5가 나오지만 3명이 있어야 5명 모두를 관리할 수 있으므로 올림을 해야한다는 의미이다.

이때 파이썬의 // 연산은 무조건 버림을 수행하기 때문에 원하는 값보다 1만큼 작게 나올 것이다.

그래서 나누기 전에 값을 조금 키워서 버림 결과가 올림 효과를 내도록 만들려고 해당 식을 사용한다. 즉, 식은 나누어 떨어지는 경우에는 값이 증가하지 않아야 하며, 나누어 떨어지지 않는 경우에는 몫이 1 증가해야 한다. 그래서 간단한 연산인 -1 을 해줌으로써 올림에 대한 보정값을 넣어주는 것이다.

 

음 아직도 왜 -1이 필요한지 이해가 안되는 분들도 계실 것 같다. 필자도 k를 구하는 식을 제외한 부분은 모두 작성하였는데, 이 부분을 해결하지 못해 서치와, 많은 시간이 필요했다. 예를 들어보겠다.

만약 i = 3, C = 3 이라면,

 

(3+3-1) // 3 = 5 // 3 = 1

(3+3) // 3 = 6 // 3 = 2

 

이렇게 계산이 될 것인데, 실제로는 감독관이 한명이면 충분한데 -1을 해주지 않아서 값이 과하게 나와버리는 것이다. 그래서 이를 조절하기 위해 -1을 사용한다고 보면 된다.

 

이 식을 구하는 과정도 있는데, 이는 너무 수학적으로 넘어가서 우선 해당 포스팅에서는 제외하고 업로드 하도록 하겠다.

어려운 문제였다 ...!