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

 

2212번: 센서

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

www.acmicpc.net

이틀동안 고민했던 문제고 반드시 오답노트를 해야할것같아서 남깁니다. 자바로 풀었습니다.

일단정답입니다. 풀이는 아래 있습니다.

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

public class Main {
	
	public static void main(String[] args) throws Exception {
		//세로 두줄 카로로 n개으로 이루어진 표가 있다.
		//첫째줄의 각칸에는 1,2,...n 이 차례 대로 들어 있고 
		//둘째 칸에는 1아ㅣ상 n이하 정수가 들어 있다.
		//첫쨰줄에서 숫자를 적절히 뽑으면 , 그 뽑힌 정수들이 이루는 집하과 뽑힌 정수들의 바로 밑의 둘쨰 줄에 들어 있는 정수들이 이루는 
		//집합이 일치한다.
		//이러한 조건을 만족시키도록 정수들을 뽑되 최대로 많이 뽑는 방법을 찾아라
		Scanner scan=new Scanner(System.in);
		//N개 센서를 설치하였다.
		int n=scan.nextInt();
		int k=scan.nextInt();
		ArrayList<Integer> lists=new ArrayList<>();
		HashMap<Integer,Integer>maps=new HashMap<>();
		ArrayList<Integer>gap=new ArrayList<>();
		if(k>=n) {
			System.out.println(0);
		}else {
			for(int i=0;i<n;i++)
			{
				int tmp = scan.nextInt();
				lists.add(tmp);
			}
			
			Collections.sort(lists);
			//System.out.println(lists);
			for(int i=0;i<n-1;i++) {
				gap.add(lists.get(i+1)-lists.get(i));
			}
			Collections.sort(gap);
			Collections.reverse(gap);
			//System.out.println(gap);
			int gapsum=0;
			for(int i=0;i<k-1;i++) {
				gapsum+=gap.get(i);
			}
			//System.out.println(gapsum);
			
			int result=lists.get(lists.size()-1)-lists.get(0)-gapsum;
			System.out.println(result);
		}
		
		
	}
}

자 하나 하나 설명할게요

먼저  입력값들 전부 받아줍니다.

int n=scan.nextInt();
int k=scan.nextInt();

for(int i=0;i<n;i++)
{
	int tmp = scan.nextInt();
	lists.add(tmp);
 }

그리고 오름차순으로 리스트들을 정렬해줍니다.

ex)1 6 9 3 6 7 ->   1 3 6 6 7 9

Collections.sort(lists);

정렬된 상태에서 이 센서들간의 차를 구합니다. 

for(int i=0;i<n-1;i++) {
	gap.add(lists.get(i+1)-lists.get(i));
}

당연히 아시겠지만 센서들의 값이 클수록 없애는게 좋겟죠 즉 센터타워의 위치입니다.

여기서 간과한게 센터 타워를 지으려고 했는데 지으면 안되고 거리만 확인하면됩니다.

전체길이- 가장긴 거리 겠죠

이떄 센서 하나를 기준으로 그다음부터 하나씩 제거가 되겠죠 먼저 거리차 가장 큰순으로 내림차순으로 정렬 합니다.

ex) gap 거리차 3 ,2, 2, 1, 0 

Collections.sort(gap);
Collections.reverse(gap);
int gapsum=0;
for(int i=0;i<k-1;i++) {
	gapsum+=gap.get(i);
}

즉 k=2인경우 6은 중복이라 그림에서 제외 

당연히 빨간 부분인 3 크기가 가장 먼저 없어지겠죠 만약에 k가 1이면 6만 제거되니까 사실상 거라차의 값을 뺼필요가 없겟죠 

k=1인경우 6은 중복이라 그림에서 제외 

그렇다면 지금 가장 큰값인 3을 전체길에서 뺴면되겟죠 당연히 list의 가장 뒤에값과 처음값의 차가 전체길이가 되고 

가장 큰값의 누적값을 뺴면 최소거리가 나오겠죠 

int result=lists.get(lists.size()-1)-lists.get(0)-gapsum;

'알고리즘 공부' 카테고리의 다른 글

백준 LCS (복습)  (0) 2023.11.07
백준 상범 빌딩(복습)  (1) 2023.11.06
백준 숫자고르기(복습)  (0) 2023.11.01
백준 토마토 (복습)  (1) 2023.10.30
백준 적록색약(복습)  (0) 2023.10.26

+ Recent posts