일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- react
- SQL
- 그래프
- 백준
- 명품자바
- 백준 18310번
- javascript
- 알고리즘
- 자바
- 백준 17451번
- 백준 16918번
- 다이나믹 프로그래밍
- HUFS 모각코 캠프
- 그리디
- 머신러닝과 딥러닝
- 백준 2512번
- ubuntu
- 백준 15787번
- 백준 3085번
- 깃헙
- AWS
- SWEA 15612번
- Python
- java_programming
- 다이나믹프로그래밍
- 백준 1987
- 백준 1331번
- 모각코
- MySQL
- 백준 1253번
Archives
- Today
- Total
차곡차곡
[BOJ/Java] 백준 16401번 - 과자 나눠주기 본문
백준 #16401 과자 나눠주기
16401번: 과자 나눠주기
첫째 줄에 조카의 수 M (1 ≤ M ≤ 1,000,000), 과자의 수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 과자 N개의 길이 L1, L2, ..., LN이 공백으로 구분되어 주어진다. 과자의 길이는 (1 ≤ L1, L2, ..., LN ≤ 1,
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken()); // 조카 수
int N = Integer.parseInt(st.nextToken()); // 과자 수
int[] stick = new int[N]; // N개의 과자 길이
st = new StringTokenizer(br.readLine());
for (int i = 0; i < stick.length; i++) {
stick[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(stick);
int start = 1;
int end = stick[N-1];
int maxLen = 0;
while (true) {
int cnt = 0;
if (start > end) {
break;
}
int mid = (start + end) / 2;
for (int i = 0; i < stick.length; i++) {
cnt += stick[i] / mid;
}
if (cnt >= M) {
start = mid+1;
maxLen = Math.max(maxLen, mid);
} else {
end = mid-1;
}
}
System.out.println(maxLen);
}
}
이분탐색 기법을 사용했다. 1과 막대의 최대 길이의 중간값을 시작으로 탐색해주는데, 이 중간값이 나눠주려는 동일한 길이의 막대 과자가 된다. 따라서 이 값으로 각 과자 길이들을 나눠줬을 때 나오는 몫이 해당 과자에서 나눠줄 수 있는 동일한 길이의 막대 과자 개수가 된다. 이 개수가 조카 수보다 클 경우, 막대 길이를 더 늘일 수 있는 것으로 시작값을 중간값 + 1로 바꿔주고, 조카 수보다 작을 경우 끝값을 중간값 - 1로 바꿔준다. 바뀐 시작값과 끝값으로 중간값을 새로 구하며 가장 긴 길이를 찾는다.
max 값을 찾기 위해 정렬을 해줬는데, max 값 하나 때문에 정렬하기엔 비용이 크니 아래 방법을 통해 찾는 것이 나을 것 같다.
Arrays.stream(stick).max().getAsInt(); // max 값
'CS > Algorithm' 카테고리의 다른 글
[BOJ/Java] 백준 5567번 - 결혼식 (0) | 2023.08.18 |
---|---|
[BOJ/Java] 백준 18353번 - 병사 배치하기 (0) | 2023.08.18 |
[BOJ/Java] 백준 7795번 - 먹을 것인가 먹힐 것인가 (0) | 2023.08.18 |
[BOJ/Java] 백준 1987번 - 알파벳 (0) | 2023.08.18 |
[SWEA/Java] SW Expert Academy 1247번 - 최적 경로 (0) | 2023.08.18 |
Comments