반응형
백준 1654번 문제 - 랜선 자르기
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
문제 분석
- K개의 서로 다른 길이의 랜선을 가지고 N개의 동일한 길이의 랜선을 제작하고자 한다.
- 이때 가장 N개의 랜선을 만들 수 있는 가장 긴 길이를 출력해라.
해결 키 포인트
- K개의 랜선 길이 합을 구하고, 합을 N으로 나눴을 때 값을 알아낸다 : 할 수 있는 최대 랜선 길이 (max)
- 방법 1 : 1부터 max까지 11개를 만들 수 있는 최대 길이 구하기
- 실패 ! 시간 초과
- 방법 2 : 이진탐색으로 1부터 max까지 11개를 만들 수 있는 최대 길이 구하기
- 성공 !
- mid구하는 법 : (low+high) / 2
-
- low 값을 0으로 하면 컴파일 오류 발생하므로 low를 1로 설정
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int K = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int[] nums = new int[K];
long sum = 0;
for (int i = 0; i < K; i++) {
nums[i] = Integer.parseInt(br.readLine());
sum += nums[i];
}
long result = 0;
long low = 1, high = sum / N;
while(low <= high) {
long mid = (high + low) / 2;
int count = 0;
for (int j = 0; j < K; j++) {
count += nums[j] / mid;
}
if (count >= N) {
result = Math.max(result, mid);
low = mid + 1;
} else {
high = mid - 1;
}
}
bw.write(result + "\n");
bw.flush();
bw.close();
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 1966] 프린터 큐 (JAVA) (0) | 2023.11.30 |
---|---|
[백준 2108] 통계학 (JAVA) (1) | 2023.11.30 |
[백준 18111] 마인크래프트 (JAVA) (2) | 2023.11.24 |
[백준 14503] 로봇 청소기 (JAVA) (0) | 2023.11.23 |
[백준 2573] 빙산 (JAVA) (0) | 2023.11.23 |