Problem
각 시험장의 응시생을 모두 감독하기 위해 필요한 감독관의 최소값을 구하는 문제입니다.
Solution
Greedy 문제입니다.
각 방마다 총 감독관은 꼭 한명씩 있어야 하기 때문에 빼줍니다.
만약 총감독관 - 감시 학생 수 > 0
이라면 부감독관이 필요하다는 뜻입니다.
부감독관은 남은 학생 수 / 부감독관의 감시 학생 수
만큼 필요합니다.
만약 딱 나누어 떨어지지 않는 경우 부감독관이 한명 더 필요합니다.
그래서 남은 학생 수 % 부감독관의 감시 학생 수 != 0
라면 부감독관을 한명 더 추가해주어야 합니다.
나머지가 0 으로 딱 나누어 떨어진다면 추가할 필요가 없습니다.
간단한 문제이지만 많이 틀리는 이유는 자료형 때문이라고 생각합니다.
100만개의 시험장에 100만명의 학생들이 들어가있는데 총감독관과 부감독관이 감시하는 학생 수가 1명밖에 안된다면
총 감독관은 100만 * 100만 만큼 필요하게 됩니다.
int 형으로는 커버할 수 없으므로 total
변수를 long
으로 선언해줍니다.
파이썬은 해당되지 않습니다. 그냥 계산해주시면 됩니다.
Java Code
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int[] a = new int[n];
st = new StringTokenizer(br.readLine());
for (int i=0; i<n; i++) {
a[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
long total = n;
for (int i=0; i<n; i++) {
// 총감독관은 무조건 한명씩 필요
a[i] -= b;
// 부감독관으로 나머지 채우기
if (a[i] > 0) {
total += a[i]/c;
if(a[i] % c != 0) {
total++;
}
}
}
System.out.println(total);
}
}
Python Code
# -*- coding: utf-8 -*-
import sys
N = B = C = 0
def solve(A):
count = 0
for i in range(N):
## 각 반에서 총 감독관은 한명씩 필요
if A[i] > 0:
A[i] -= B
count += 1
## 나머지 부감독관으로 채우기
if A[i] > 0:
count += int(A[i]/C)
if A[i] % C != 0:
count += 1
return count
if __name__ == '__main__':
N = int(sys.stdin.readline())
A = list(map(int, sys.stdin.readline().split()))
B, C = map(int, sys.stdin.readline().split())
result = solve(A)
print(result)
'알고리즘 문제 > Samsung' 카테고리의 다른 글
백준 14502번. 연구소 (Java, Python) (5) | 2018.12.28 |
---|---|
백준 14500번. 테트로미노 (Java, Python) (2) | 2018.12.27 |
백준 14888번. 연산자 끼워넣기 (Java, Python) (0) | 2018.12.27 |
백준 14499번. 주사위 굴리기 (Java, Python) (0) | 2018.12.23 |
백준 14501번. 퇴사 (Java, Python) (0) | 2018.12.19 |