결정 알고리즘, 이분탐색_마구간 배치하기
✅ 마구간에 말들을 배치할 때, 가장 가까운 말의 최대 거리를 구하세요.
마구간이 주어집니다. 마구간은 좌표위에 있습니다. 1 2 8 4 9
말을 c마리를 마구간에 배치할 때 가장 가까운 두 말 사이의 거리가 최대가 되도록 하세요
가장 가까운 두 말 사이의 거리가 최대가 될 때 그 거리를 출력하세요
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.example.ct_inflean_2024.String;
import java.util.*;
class Main {
//⭐️ 이분탐색
public int count( int mid, int[] input){ //유효성 검사 함수
int cnt=1; //맨 처음에 한 마리 배치하고 시작
int ep= input[0];
for(int i=1; i<input.length; i++){
if((input[i]- ep)>=mid){
cnt++;
ep= input[i];
}
}
return cnt;
}
//⭐️ 결정 알고리즘, 이분탐색
public int solution(int n, int c, int[] input){
int answer=0;
Arrays.sort(input);
//binary search
int min= 1; //두 말이 가질 수 있는 최소 거리
int max= input[n-1]; //두 말이 가질 수 있는 최대 거리
while(min<=max){
int mid= (min+max)/2;
if(count(mid, input)>= c){ //mid값이 유효함
answer= mid;
min= mid+1;
}else{
max= mid-1;
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc= new Scanner(System.in);
int n= sc.nextInt();
int c= sc.nextInt(); //말 개수
int[] input= new int[n];
for(int i=0; i<n; i++){
input[i]= sc.nextInt();
}
System.out.print(T.solution(n, c, input));
}
}
//⭐️input:
5 3
1 2 8 4 9
//⭐️output:
3
🔵 ThingsILearned
✔️ 결정 알고리즘, 이분탐색
- 결정 알고리즘은 가능한 값이 있을법한 범위를 구해서 그 안을 탐색하는 것
- 따라서 우리가 구하고자 하는 값은 말 사이 거리니까 그 거리가 있을법한 범위를 구하자면
min
: 1max
: 배열 최댓값
- 따라서 마구간 배열(
1 2 8 4 9
)을 탐색하는게 아니라 ❌ - 거리 범위
min
~max
사이를 탐색해야 한다 ⭕️
✔️ 유효성 검사 count
함수
solution
함수에서 결정 알고리즘, 이분탐색을 하면서mid
값을 구했음- 이
mid
값이 유효한지, 말 사이 거리로 유효한지 확인하는 작업을count
함수에서 실행 - 말 사이 거리가
mid
값보다 크거나 같은게 말 개수c
만큼 있어야 함 - 우선 말 한마리를 맨 처음에 놓고
- 그래서
cnt
가 1에서 시작 - 그리고
for
문은 1부터 돌기 시작
- 그래서
ep
(endpoint
)라는 변수를 만들어서input[i]
에서부터ep
까지의 거리를 구했을 때mid
보다 크거나 같아야 함- 만약 크거나 같다면,
cnt++
- 그리고
ep
를input[i]
값으로 만듦.
- 만약 크거나 같다면,
- 그리고 또 새로운
input[i]
값에서ep
를 빼서 거리를 구하고, 이 거리가mid
보다 크거나 같은지 보고.
🔴 Trouble Shooting
- count 함수
(input[i]- ep)>=mid
mid
보다 크거나 같아도 됨 - solution 함수의 결정 알고리즘에서
count(mid, input)>= c
c
보다 크거나 같아도 됨
This post is licensed under CC BY 4.0 by the author.