티스토리 뷰

알고리즘/백준

[BAEKJOON]2212 센서

응애~ 개발자 2023. 1. 8. 00:31
728x90
반응형

문제 요약

  • 알고리즘 분류: 그리디, 정렬
  • 난이도:Gold5
  • 문제내용:
    • N개의 센서와 K개 집중국이 있다.
    • K개의 기지국을 설치해서 송신할수 있도록 최소 거리를 구해라.
 

2212번: 센서

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

www.acmicpc.net

문제풀이

 이번 문제는 그리디문제인데, 약간 아이디어 문제측에 속한다. 정답을 어떻게 구할지만 구현은 쉽다. 그리디에 설명은 여기에서 확인 해보면된다.

 문제 접근 방법

 예제 1번을 그림으로 나타낸 것이다. 그림 보면 x 좌표 위치가 일직 선상에 있어서 먼저 아래 그림과 같이 정렬 하면된다.

결과

 그 다음 영역을 나누어야 하는데 그 기준은 각 거리가 가장 긴것을 K - 1 기준으로 나누면 최소 거리가 나온다. 코드로는 위와 같이 구현 하는 방법은 센서 위치를 정렬한 다음 각 센서 거리를 구한 다음 센서 거리를 정렬 해서 가장 큰 것부터 K - 1개까지 빼고 다 더하면된다.

정리

  1. 센서 위치들을 정렬한다.
  2. 각 센서의 거리를 구한 다음 정렬한다.
  3. 큰 순 으로 K - 1개를 합한다.

Code

Python

N = int(input())
K = int(input())
sensor = sorted(list(map(int, input().split())), reverse=True)
distances = []
# 각 센서 간의 거리를 계산하여 내림차순 정렬
for i in range(1, N):
    distances.append(sensor[i - 1] - sensor[i])
distances.sort(reverse=True)

# 가장긴것 제외 하고 합하기
print(sum(distances[K - 1:]))

Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws IOException{
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int K = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine());
		Integer[] sensor = new Integer[N];
        // 입력 받은 센서 위치 정렬
		for(int i = 0; i < N; i++) {
			sensor[i] = Integer.parseInt(st.nextToken());
		}
		Arrays.sort(sensor, Collections.reverseOrder());
		Integer[] distances = new Integer[N - 1];
        
        // 센서 거리 계산해서 정렬
		for(int i = 0; i < N - 1; i++) {
			distances[i] = sensor[i] - sensor[i + 1];
		}
		Arrays.sort(distances, Collections.reverseOrder());
		
        // 거리 긴 것 제외하고 합하기
        int sum = 0;
		for(int i = K - 1; i < N - 1; i++) {
			sum += distances[i];
		}
		System.out.println(sum);
		
	}
	
}

 

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BAEKJOON]16953 A → B  (0) 2023.01.10
[BAEKJOON]1461 도서관  (0) 2023.01.08
[BAEKJOON]15666 N과 M (12)  (0) 2023.01.06
[BAEKJOON]15663 N과 M (9)  (0) 2023.01.05
[BAEKJOON]15657 N과 M (8)  (0) 2023.01.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함