학교생활/23-1 '모여서 각자 코딩'
[모각코 23-1] 1회차 - 백준 2212번 센서
the0
2023. 3. 20. 09:42
728x90
* 그리디
중요한 건 집중국을 둘 센서의 위치를 정확히 알아야하는 것이 아니다.
전체 코드:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int sensors = Integer.parseInt(br.readLine());
int K = Integer.parseInt(br.readLine()); // 집중국
int[] pos = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Arrays.sort(pos);
Integer[] diff = new Integer[sensors-1];
for(int i=1;i<sensors;i++){
diff[i-1] = pos[i]-pos[i-1];
}
Arrays.sort(diff, (d1, d2)-> {
return d2 - d1;
});
int total=0;
for(int i=K-1;i<diff.length;i++){
total += diff[i];
}
System.out.println(total);
}
}
예시는 입력 2
10
5
20 3 14 6 7 8 18 10 12 15
를 사용하여 설명한다.
int[] pos = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
Arrays.sort(pos);
int[] pos: 입력 세 번째 줄로 들어오는 센서의 위치를 오름차순 정리한다.
예)
20 3 14 6 7 8 18 10 12 15 -> 3 6 7 8 10 12 14 15 18 20
Integer[] diff = new Integer[sensors-1];
for(int i=1;i<sensors;i++){
diff[i-1] = pos[i]-pos[i-1];
}
Arrays.sort(diff, (d1, d2)-> {
return d2 - d1;
});
Integer[] diff : 센서의 위치의 차이를 구한다.
* int 배열이 아닌 Integer 를 쓴 이유는 Arrays.sort 내림차순에 람다식을 사용하기 위함
예)
int[] pos = {3 6 7 8 10 12 14 15 18 20}
Integer[] diff = {3, 1, 1, 2, 2, 2, 1, 3, 2}
내림차순 sort 후 -> Integer[] diff = {3, 3, 2, 2, 2, 2, 1, 1}
int total=0;
for(int i=K-1;i<diff.length;i++){
total += diff[i];
}
System.out.println(total);
1. 최대 K개의 집중국의 수신 가능 영역의 길이의 합의 최솟값을 출력해야 한다.
2. 집중국을 K개 설치한다는 것은, 일직선 상의 센서들에 chunk 를 K-1번 끊는다는 것.
예) 집중국 5개 -> 3 / 6 7 8 / 10 / 12 14 15 / 18 20
=> 즉 내림차순된 Integer[] diff 에서 K-1 부터 total sum 을 더함
728x90