1 분 소요

센서 (백준 Gold 5)

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

n개의 센서와 k개의 기지국 개수가 주어지고
n개의 센서들의 각 좌표가 주어질 때
기지국으로 관리할 수 있는 최소 영역 범위를 구하는 문제

  • 일단 ‘기지국’을 따로 설치하여 비교하는 문제는 아니다
    그러니까 각각의 센서들과 기지국 위치를 비교하여
    그 합이 최소가 되는 것을 구하는 방식은 아님
    (처음에 헷갈린 부분)
    (아마 이러한 방식이였다면, 스택/큐의 사용이 고려되지 않을까?)
    (예제 1이 해당 방식으로 풀어지지 않기에 다른 방법이라 생각)

  • 요점은 ‘기지국’을 임의의 영역에 설치하였을 때,
    모든 기지국이 ‘감당’하는 길이들을 줄이는 것

풀이 방법

사실 처음에는 감이 잘 안왔지만
요점은 생각보다 간단하였다

  • 각 정점 간의 ‘길이’가 중요

따라서 먼저 각 좌표들을 ‘정렬’하고
각 좌표들의 ‘거리’를 모은 후
다시 그 거리들을 정렬시키면 쉽게 풀 수 있는 문제이다

  • 각각의 거리들 중, k-1개 만큼 ‘무거운 거리’를 제거
    (k가 1인 경우는 모든 거리를 담당해야 하기에 -1)

  • k가 2개부터는 특정한 ‘거리’의 반대 방향에 기지국을 설치 가능

k = 2 인 경우
a - b  c - d

b c 거리가 제일 길다면
-> a-b 거리와 c-d 거리만 구할 수 있음

반대로 a b 거리가 제일 길다면

a b-c-d

이런식으로 기지국을 설치 가능

따라서 기지국을 설치하는 위치는 딱히 상관없고
기지국 k-1개 당, ‘긴 거리’를 제거해 나가면 풀 수 있는 문제

제출 코드

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
	int n, k;
	cin >> n >> k;

	vector<int> cod(n),lenVec;
	for (int i = 0; i < n; i++)
	{
		cin >> cod[i];
	}

	sort(cod.begin(), cod.end());

	for (int i = 1; i < n; i++)
	{
		lenVec.push_back(cod[i] - cod[i - 1]);
	}

	sort(lenVec.begin(), lenVec.end());

	int fullLen = cod.back() - cod[0];
	for (int i = 0; i < k - 1; i++)
	{
		if (lenVec.empty())
			break;
		fullLen -= lenVec.back();
		lenVec.pop_back();
	}

	cout << fullLen;

	return 0;
}

결과

Image

if(lenVec.empty())

런타임 에러는 해당 코드를 빼먹고 돌려서 발생하였다
이후 넣어주어 통과할 수 있었다
(k가 n개 보다 많이 들어올 수 있는 점을 간과하였다)

댓글남기기