문제
https://www.acmicpc.net/problem/2792
보석 공장에서 보석 상자를 유치원에 기증했다. 각각의 보석은 M가지 서로 다른 색상 중 한 색상이다. 원장 선생님은 모든 보석을 N명의 학생들에게 나누어 주려고 한다. 이때, 보석을 받지 못하는 학생이 있어도 된다. 하지만, 학생은 항상 같은 색상의 보석만 가져간다.
한 아이가 너무 많은 보석을 가져가게 되면, 다른 아이들이 질투를 한다. 원장 선생님은 이런 질투심을 수치화하는데 성공했는데, 질투심은 가장 많은 보석을 가져간 학생이 가지고 있는 보석의 개수이다. 원장 선생님은 질투심이 최소가 되게 보석을 나누어 주려고 한다.
상자에 빨간 보석이 4개 (RRRR), 파란 보석이 7개 (BBBBBBB) 있었고, 이 보석을 5명의 아이들에게 나누어 주는 경우를 생각해보자. RR, RR, BB, BB, BBB로 보석을 나누어주면 질투심은 3이 되고, 이 값보다 작게 나누어 줄 수 없다.
상자 안의 보석 정보와 학생의 수가 주어졌을 때, 질투심이 최소가 되게 보석을 나누어주는 방법을 알아내는 프로그램을 작성하시오.
입력
첫째 줄에 아이들의 수 N과 색상의 수 M이 주어진다. (1 ≤ N ≤ 109, 1 ≤ M ≤ 300,000, M ≤ N)
다음 M개 줄에는 구간 [1, 109]에 포함되는 양의 정수가 하나씩 주어진다. K번째 줄에 주어지는 숫자는 K번 색상 보석의 개수이다.
출력
첫째 줄에 질투심의 최솟값을 출력한다.
풀이 과정
이 문제는 이분탐색 알고리즘을 사용하여 풀었습니다.
1. 초기값 설정: left는 1로, right는 보석 종류 중 가장 많은 개수로 설정했습니다. 이는 질투심은 가장 많은 보석을 가진 학생이 가지고 있는 보석의 개수이기 때문에, 그 이상은 가질 수 없기 때문입니다.
2. 사람 수 계산: 반복문을 통해 각 보석 종류를 mid 값으로 나누어 나머지 여부에 따른 사람 수를 계산합니다.
3. 이분 탐색: 사람 수가 N보다 크면 보석을 더 많이 나눠줘야 하므로 left 값을 늘리고, N보다 작으면 right 값을 줄입니다. 동시에 현재 mid 값을 기록합니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 보석_상자 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] jewel = new int[M];
int jewelMax = 0;
for (int i = 0; i < M; i++) {
jewel[i] = Integer.parseInt(br.readLine());
jewelMax = Math.max(jewelMax, jewel[i]);
}
int left = 1;
int right = jewelMax;
int ans = 0;
while (left <= right) {
int mid = (right + left) / 2;
int personCnt = 0;
for (int i = 0; i < M; i++) {
if (jewel[i] % mid == 0) {
personCnt += jewel[i] / mid;
} else {
personCnt += jewel[i] / mid + 1;
}
}
if (personCnt > N) {
left = mid + 1;
} else {
right = mid - 1;
ans = mid;
}
}
System.out.println(ans);
br.close();
}
}
'Algorithm' 카테고리의 다른 글
아호 코라식(Aho-Corasick) 알고리즘(2) (0) | 2024.08.20 |
---|---|
아호 코라식(Aho-Corasick) 알고리즘(1) (1) | 2024.08.14 |
KMP 알고리즘이란? (2) | 2024.08.05 |
[백준 9663/Java] N-Queen (0) | 2023.05.07 |
[백준 1874/Java] 스택 수열 (0) | 2023.03.18 |
느리더라도 단단하게 성장하고자 합니다!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!