알고리즘/Algospot

[Algospot] DARPA Grand Challenge (문제 ID : DARPA)

cho____sh 2020. 1. 28. 17:19
728x90

문제

DARPA Grand Challenge 는 운전자 없는 차들을 컴퓨터 인공지능으로 조작해 누가 먼저 결승점에 도달하느냐를 가지고 겨루는 인공지능 대회입니다. 2004년 DARPA Grand Challenge 의 과제는 사막을 가로지르는 240km 도로를 완주하는 것이었습니다.

우리는 이 경기를 N 개의 카메라로 중계하려고 합니다. 이 도로에는 카메라를 설치할 수 있는 곳이 M 군데 있습니다. 여기에 카메라를 배치하여, 가장 가까운 두 카메라 간의 간격을 최대화하고 싶습니다. 이와 같은 배치를 찾아내는 프로그램을 작성하세요.

 

입력

입력의 첫 줄에는 테스트 케이스의 수 C (<= 50) 이 주어집니다. 각 테스트 케이스의 첫 줄에는 카메라의 개수 N (<= 100) 과 설치 가능한 중계소의 수 M (N <= M <= 200) 이 주어집니다. 그 다음 줄에는 M 개의 실수로, 카메라를 설치 가능한 곳의 위치가 오름 차순으로 주어집니다. 각 위치는 시작점에서부터의 거리로, 240 이하의 실수이며 소숫점 둘째 자리까지 주어질 수 있습니다.

 

출력

각 테스트 케이스마다 가장 가까운 두 카메라 간의 최대 간격을 소수점 셋째 자리에서 반올림해 출력합니다.


최적화와 결정 문제이다. 

최적화와 결정 알고리즘은 optimize() 와 decision()으로 구성된다. optimize는 문제가 요구하는 답을 찾는 함수이고, decision은 특정 값에 대해 그 값으로 답이 가능한지 불가능한지 여부를 반환한다. 

이 문제에서는 optimize(camera) = 카메라 간 최소 간격의 최대치를 반환.

decision(camera, gap) = 모든 카메라를 적절히 배치해 간격을 gap 이상으로 하는 방법이 있는가를 반환한다.

이 두 함수를 적절히 설계하면 답을 구할 수 있다. 

 

optimize에서 최적화 된 간격을 구하기 위해  이분 탐색을 사용하는걸 확인하자.

 

그리고 또 하나, 답을 소수점 둘째자리까지 고정해서 출력을 해야하는데 이를 위해 <iomanip> 헤더를 포함하고

답을 출력하기 전에 cout << fixed << setprecision(2) 을 통해 부동소수점을 고정해야한다.

 

 

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/Algospot/DARPA.cpp

 

chosh95/STUDY

알고리즘 문제풀이. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

C++ 코드

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <vector>
using namespace std;

int C, N, M;
vector<double> location;

bool decision(int camera, double gap)
{
	double limit = -1;
	int install = 0;
	for (int i = 0; i < location.size(); i++) {
		if (limit <= location[i]) {
			++install;
			limit = location[i] + gap;
		}
	}
	return install >= camera;
}

double optimize(int camera)
{
	double lo = 0.0, hi = 241.0;
	for(int it = 0;it<100;it++){
		double mid = (lo + hi) / 2.0;
		if (decision(camera, mid))
			lo = mid;
		else
			hi = mid;
	}
	return lo;
}

int main()
{
	cin >> C;
	while (C--) {
		location.clear();
		cin >> N >> M;
		for (int i = 0; i < M; i++) {
			double num;
			cin >> num;
			location.push_back(num);
		}
		cout << fixed << setprecision(2);
		cout << optimize(N) << endl;
	}
}

 

728x90