-
[백준 2212번] 센서(자바)Algorithm/Greedy Algorithm 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); } }
'Algorithm > Greedy Algorithm' 카테고리의 다른 글
[백준 11497번] 통나무 건너뛰기(자바) (0) 2022.03.17 [백준 15903번] 카드 합체 놀이(자바) (0) 2022.03.16 [백준 2437번] 저울 (Java 풀이) (0) 2022.03.11 [백준 1783번] 병든 나이트 (Java 풀이) (0) 2022.03.11 [백준 2812번] 크게 만들기 (Java 풀이) (0) 2022.03.10