Algorithm/Greedy Algorithm
[백준 2212번] 센서(자바)
agility
2022. 3. 12. 16:54
백준알고리즘 2212번 : 센서
센서가 커버 가능한 수신 가능 영역을 잘 쪼개보니 실마리를 찾을 수 있었다.
센서의 위치를 정렬한뒤, 위치별 차이(즉 센서별 수신이 필요한 영역)를 새로운 배열로 정의한다.
새로운 배열(gap)의 값 중 큰 것부터 집중국의 개수-1 만큼 차감하여 합의 최솟값을 구한다.
(집중국이 1개일때 차감없이 모든 영역을 커버할 수 있다.)
센서의 위치가 각 1 3 6 7 9 라고 한다면
각 센서의 차이는
2 3 1 2 이다.
집중국이 1개일때, 수신 가능 영역의 길이의 합은 2 + 3 + 1+ 2 = 8이다.
집중국이 2개일때, 수신 가능 영역의 길이의 합은 2 + 0 + 1+ 2 = 5이다.
집중국이 3개일때, 수신 가능 영역의 길이의 합은 2 + 0 + 1+ 0 = 3이다.
집중국이 4개일때, 수신 가능 영역의 길이의 합은 0 + 0 + 1+ 0 = 1이다.
집중국이 5개일때, 수신 가능 영역의 길이의 합은 0이다.(모든 센서 위치에 집중국을 하나씩 박는다.)
풀이 과정
1. 센서의 위치 배열을 정렬한다.
2. 정렬한 센서간의 위치 차이를 새 배열로 정의한다.
3. 위치 차이 배열을 정렬한뒤, 집중국의 개수 -1 만큼 큰 위치 차이 값을 소거한다.
4. 나머지 위치 차이 값을 더하여 값을 출력한다.
▽ 정답 소스 보기
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {// No2212 : 센서
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int sensor = Integer.parseInt(br.readLine());
int K = Integer.parseInt(br.readLine());
int[] pos = new int[sensor];
int ans = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < sensor; i++) {
pos[i] = Integer.parseInt(st.nextToken());
}
if (K < sensor) {//집중국이 센서의 갯수 이상이면 수신 가능영역 길이의 최솟값은 0이다.
int[] gap = new int[pos.length - 1];
Arrays.sort(pos);
for (int i = 0; i < pos.length - 1; i++) {
gap[i] = pos[i + 1] - pos[i];
ans += gap[i];
}
Arrays.sort(gap);
for (int i = 0; i < K - 1; i++) {
if (i <= gap.length - 1) {
ans -= gap[gap.length - 1 - i];
}
}
}
System.out.println(ans);
}
}