https://www.acmicpc.net/problem/13458
13458번: 시험 감독
첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다. 셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)
www.acmicpc.net
내 코드
import sys
input = sys.stdin.readline
import math
n = int(input())
atd =list(map(int, input().split()))
b, c = map(int, input().split())
#총 감독관 - b명 , 부감독관 - c명 관리
#무조건 b는 ㅇㅋ
ans =n #n은 최솟값
for i in atd:
ans += max(math.ceil((i-b)/c),0)
print(ans)
코드 리뷰
연산 문제
삼성 기출 문제를 보다가, 브론즈 2가 있길래 냅다 풀었다. 삼성은 역시 문제를 꼼꼼하게 읽어야 풀 수 있도록 했다. 당연히 나는 사람의 최솟값을 구하는 문제니까, 음수가 존재하지 않을 줄 알고 고려하지 않았다. 하지만 여기서 한 대 얻어맞았다..다시 정신 잡고 풀었더니 통과했다...
코드는 매우 간단하다. 시험감독관 수의 최솟값을 구하는 것이므로 사실상 조건을 해결하는 코드는 이게 전부다.
ans =n #n은 최솟값
for i in atd:
ans += max(math.ceil((i-b)/c),0)
print(ans)
일단 반 하나당 감독관이 있어야 하니까, n을 감독관 수의 최솟값으로 설정한다. 그리고 반별 응시자 수를 하나씩 고려하면서 감독관 수를 계산해줄 것이다. for문은 반 하나씩 검토하기 위한 조건문이다.
그리고 중요한 점은 //가 아닌 /를 써줘야 한다는 것이다.

몫을 구하는 것이 아니라, 남는 사람들을 통솔하기 위해 몇 명의 감독관이 더 필요하냐 가 문제에서 요구하는 것이기 때문에 (각 반에 남은 응시자들 / 부감독관이 관리할 수 있는 최대 응시자수) 가 되는 것이다. 나는 ceil을 이용하여 연산 결과를 올림해주었다. (사람을 쪼갤 수 없으니까..)
그리고 여기서 중요한 점은 max값을 취해주는 것이다. 이렇게 아무런 조건을 달지 않고 i-b를 하게 된다면 음수가 결과가 될 수 있다. 그래서 값이 엉망이 되어버릴 수 있는데, 다시 말하지만 사람 문제는 음수가 될 수 없다...그러므로 아무리 적어도 0이 최소가 될 수 있게 max를 통해 만들어주었다.
단순하지만 문제를 꼼꼼하게 읽어야 한다는 교훈을 주는 문제였다.
'코딩테스트 대비 > 백준(BOJ)' 카테고리의 다른 글
| [Python][백준/BOJ] 14503번 : 로봇 청소기 (0) | 2023.09.23 |
|---|---|
| [Python][백준/BOJ] 8979번 : 올림픽 (0) | 2023.09.21 |
| [Python][백준/BOJ] 14940번 : 쉬운 최단거리 (0) | 2023.09.20 |
| [Python][백준/BOJ] 2468번 : 안전 영역 (0) | 2023.09.08 |
| [Python][백준/BOJ] 7576번 : 토마토 (0) | 2023.08.30 |