알고리즘/백준
[java] 백준 2212 센서
24시간이모자란
2023. 1. 8. 15:45
문제
2212번: 센서
첫째 줄에 센서의 개수 N(1 ≤ N ≤ 10,000), 둘째 줄에 집중국의 개수 K(1 ≤ K ≤ 1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 있
www.acmicpc.net
문제 이해를 잘 해야한다. 처음에 센서들의 거리 누적합을 구하는줄 알고 잘못된 접근을 하였다.
센서의 개수 N , 집중국의 개수 K 가 주어진다.
먄약 K == N 이면 각 집중국마다 센서가 있음으로 거리합이 0 이 된다 .
만약 K == 1 이면, 집중국은 센서의 거리 범위 ( i.. j ) 안에 놓기만 하면 j - i 거리합이 된다.
K > 1 이면, 이때부터 잘 봐야한다.
1. 센서의 거리합을 최소화 해야 하기 때문에 우선 중복을 제외한 센서들을 오름차순 정렬 한다. ,
2. 그런 다음 센서들간의 거리차를 저장한다. 거리차는 ( N - 1 ) 개이다 .
3. 거리차 배열을 정렬하고, 거리차 배열의 길이 = len
4. len - (k-1) 까지의 누적합을 구한다.
다음사진은 문제 이해하는데 도움이 될까바 첨부한다.
코드
import java.io.*;
import java.util.*;
public class Main {
static int res = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
FastReader fr = new FastReader();
int N = fr.nextInt();
int K = fr.nextInt();
ArrayList<Integer> sensorL = new ArrayList<>();
ArrayList<Integer> dist = new ArrayList<>();
for(int i = 0 ; i< N ;i++){
sensorL.add(fr.nextInt());
}
Collections.sort(sensorL); //오름차순 정렬
for(int i = 1 ; i< N ;i++){
if(sensorL.get(i) != sensorL.get(i-1)) {
dist.add(sensorL.get(i) - sensorL.get(i-1)); // 센서 거리의 차 저장
}
}
Collections.sort(dist);
int ans = 0 ;
for(int i = 0 ;i< dist.size() - (K-1) ; i++){
ans += dist.get(i);
}
//System.out.println(dist);
System.out.println(ans);
}
public static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public FastReader(String s) throws FileNotFoundException {
br = new BufferedReader(new FileReader(new File(s)));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
String nextLine() {
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
}