반응형
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그
www.acmicpc.net
문제풀이
- 이분 탐색으로 구현
- 정확하게 이분탐색을 알아야만 풀 수있음
- int형이아닌 long으로 받는 것이 중요 (N=1,000,000)
- 길이는 자연수라고 했으므로 min 값을 1로 잡는 것이 중요(상식적으로 길이가 0인 선은 없는 것임)
min | min | middle |
1 | 802 | 401 |
1 | 400 | 200 |
201 | 400 | 300 |
299 | 201 | 250 |
201 | 249 | 225 |
201 | 224 | 212 |
201 | 211 | 206 |
201 | 205 | 203 |
201 | 202 | 201 |
201 | 200 | 201 |
Java
package Z_ShinHanCard_Prepare;
/*
* 4 11
802
743
457
539
* */
import java.io.*;
import java.util.*;
public class D3백준_랜선짜르기_이분탐색 {
static ArrayList<Integer> arr = new ArrayList<Integer>();
public static void main(String[] args) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
StringTokenizer st = new StringTokenizer(input);
int R = Integer.parseInt(st.nextToken());
int C = Integer.parseInt(st.nextToken());
for(int i =0 ; i <R ; i++)
{
input = br.readLine();
int temp = Integer.parseInt(input);
arr.add(temp);
}
Collections.sort(arr);
//arr : 457 539 743 802
long max = arr.get(R-1);
long min = 1; //자연수라서 1
long middle =0;
while(max>=min) //이분탐색
{
middle = (max+min)/ 2;
long allcount =0;
for(int i =0 ; i <arr.size(); i++)
{
allcount += arr.get(i) / middle;
}
if(allcount >= C)
{
min = middle +1;
}else if(allcount <C )
{
max=middle -1;
}
}
System.out.println(max);
// TODO Auto-generated method stub
}
}
반응형
'Algorithm' 카테고리의 다른 글
[백준 14888] 연산자 끼워넣기(C++, Java) (0) | 2020.09.09 |
---|---|
[백준 9536] 여우는 어떻게 울지? (Java) (0) | 2020.09.08 |
[백준 9012] 괄호 (Java) (0) | 2020.09.07 |
[백준 7562] 나이트의 이동 (C++, Java) (0) | 2020.09.07 |
[백준 2664] 촌수계산 (C++, Java) (0) | 2020.09.06 |