• 문제 링크
2212번: 센서
첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있
www.acmicpc.net
• 풀이 과정
예제 입력 1을 예시로 1, 3 구간과 6, 9 구간에 집중국을 2개 설치 시, 수신 가능영역의 최소 길이는 2 + 3 = 5 가 된다.
이는 각각의 수신 가능한 센서를 오름차순 정렬 및 센서 간의 거리를 구해 더한 값, 0 + 1 + 2+ 2 = 5 와 같고,
이를 일반화하여 알고리즘을 풀이한다.
센서의 좌표를 입력받아 오름차순 정렬 후, 각 센서 간 거리를 구해 dist 배열에 저장하고, (dist[i] = arr[i + 1] - arr[i])
수신 가능영역의 최소값을 구해야 하므로 dist 배열을 오름차순 정렬한다.
이어서 k개의 집중국이 n개의 센서 중 수신 가능한 영역인
0에서 n - k - 1번 인덱스의 범위내의 거리 값을 누적해 정답으로써 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int k = Integer.parseInt(br.readLine());
if (k < n) {
st = new StringTokenizer(br.readLine());
int[] arr = new int[n];
for (int i = 0; i < n; i++)
arr[i] = Integer.parseInt(st.nextToken());
Arrays.sort(arr);
int[] dist = new int[n - 1];
for (int i = 0; i < n - 1; i++)
dist[i] = arr[i + 1] - arr[i];
Arrays.sort(dist);
int sum = 0;
for (int i = 0; i < n - k; i++)
sum += dist[i];
bw.write(String.valueOf(sum));
} else
bw.write("0");
bw.flush();
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 2885 초콜릿 식사 - Greedy / Java (0) | 2022.12.23 |
---|---|
[백준] 2141 우체국 - Greedy / Java (0) | 2022.12.22 |
[백준] 2012 등수 매기기 - Greedy / Java (0) | 2022.12.20 |
[백준] 2841 외계인의 기타 연주 - Data Structure / Java (0) | 2022.12.19 |
[백준] 2304 창고 다각형 - Data Structure / Java (0) | 2022.12.18 |
댓글