어제의 나보다 성장한 오늘의 나

[백준][BOJ-2212][JAVA] 센서 본문

알고리즘/백준(BOJ)

[백준][BOJ-2212][JAVA] 센서

NineOne 2021. 6. 18. 21:38

https://www.acmicpc.net/problem/2212

 

2212번: 센서

첫째 줄에 센서의 개수 N(1<=N<=10,000), 둘째 줄에 집중국의 개수 K(1<=K<=1000)가 주어진다. 셋째 줄에는 N개의 센서의 좌표가 한 개의 정수로 N개 주어진다. 각 좌표 사이에는 빈 칸이 하나 이상 있으며

www.acmicpc.net

import java.io.*;
import java.util.*;

class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int K = Integer.parseInt(br.readLine());
		int[] sensorArr = new int[N];
		Integer[] diffSensorArr = new Integer[N-1];
		
		// 입력값
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i =0; i<N; i++) {
			sensorArr[i] = Integer.parseInt(st.nextToken());
		}
		
		// 센서 오름차순 정렬
		Arrays.sort(sensorArr);
		
		// 센서간의 차이 구하기
		for(int i=0; i<N-1; i++) {
			diffSensorArr[i] = sensorArr[i+1] - sensorArr[i];
		}
		
		// 센서 차이를 구한 배열 오름 차순
		Arrays.sort(diffSensorArr);
		
		// diffSensorArr 배열에서 -(k+1) 만큼 까지 더하면 답! 때문에 N-K만큼
		int sum = 0;
		for(int i=0; i<N-K; i++) {
			sum += diffSensorArr[i];
		}
		
		System.out.println(sum);
	}
}

정리

처음 문제를 읽었을 때는 이해하기가 어려웠다.

문제를 찬찬히 읽어보면 "센서들은 이 직선 위의 한 기점인 원점으로부터의 정수 거리의 위치에 놓여 있다고 하자." 이 문구를 보고 예제를 값들을 나열해 보면

1 3 6 6 7 9이다. 그리고 기지국들을 설치해보면 1과 3 사이에 하나 6과 9 사이의 하나 설치하면 합이 5가 된다.

이를 토대로 위의 코드를 설명하자면!

1. 입력값들을 오름차순으로 정렬한다.

2. 각 센서들 마다 차이를 구한다. ( 수신 가능 영역의 거리의 합을 위해 )3. 그렇다면 이제 여기서 차이가 가장 큰 값을 집중국 - 1 만큼 빼면 된다 즉 각 센서들의 차이를 배열을 정렬해서 N-K만큼 다 더하면 된다!끝!

Comments