第13週:バイナリ探索問題1
11496 ワード
✔BOJ_17266
これは最低コストを探す問題であるため,バイナリナビゲーションとして解く.光がカバーできるかどうかを確認する関数を作成する過程でも難しくなく、ㅠㅠは迷いすぎたので参照コードで解答した.
これは最低コストを探す問題であるため,バイナリナビゲーションとして解く.光がカバーできるかどうかを確認する関数を作成する過程でも難しくなく、ㅠㅠは迷いすぎたので参照コードで解答した.
package BaekJoon.Binary;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;
import java.util.StringTokenizer;
public class BOJ_17266 {
public static int n,m;
public static int[] position;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 굴다리의 길이 n
n = Integer.parseInt(br.readLine());
// 가로등의 개수
m = Integer.parseInt(br.readLine());
// 설치할 수 있는 가로등의 위치 x
position = new int[m];
StringTokenizer st= new StringTokenizer(br.readLine());
for(int i=0;i<m;i++){
position[i] = Integer.parseInt(st.nextToken());
}
// 최소 비용을 위한 가로등의 최소 높이!
// 가로등의 높이가 될 수 있는 범위 내에서 이분 탐색을 하면 된다.
int start = 1;
int end = n;
int answer=0;
while(start<=end){
int mid =(start+end)/2;
// 지금 mid의 길이로 모든 곳을 비출 수 있다면
// mid 하나 줄여서 다시 돌려보기(해당 mid값은 answer에 보관)
if(canLight(mid)){
answer= mid;
end= mid-1;
}
// mid 길이로는 부족하다면
// mid 하나 더 더해서 돌려보기
else{
start = mid+1;
}
}
System.out.println(answer);
}
// 이게 어렵다
// https://velog.io/@jms8732/17266.-%EC%96%B4%EB%91%90%EC%9A%B4-%EA%B5%B4%EB%8B%A4%EB%A6%AC
// 참조했습니다ㅠ
private static boolean canLight(int mid) {
int start = 0;
for(int i=0;i<m;i++){
int left = position[i] - mid;
int right = position[i] + mid;
if(left > start) return false;
start = right;
}
return n-start <=0;
}
}
Reference
この問題について(第13週:バイナリ探索問題1), 我々は、より多くの情報をここで見つけました https://velog.io/@alswn9938/13주차-이진탐색-문제1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol