거의 알고리즘 일기장

백준 15686번 _ 치킨 배달 본문

알고리즘 문제풀이

백준 15686번 _ 치킨 배달

건우권 2020. 4. 8. 11:32

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

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸, 왼쪽에서부터 c번째 칸을 의미한다. r과 c는 1부터 시작한다. 이 도시에 사는 사람들은 치킨을 매우 좋아한다. 따라서, 사람들은 "치킨 거리"라는 말을 주로 사용한다. 치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이다. 즉, 치킨 거리는

www.acmicpc.net

 

1. 풀이방법

 

1) 치킨집에 대한 point값, 집에 대한 point값을 저장해놓는다.

2) 치킨집을 하나 고르고, 그 치킨집과 집들의 치킨거리를 구한다.

3) 2)를 치킨집이 m개될때까지, 모든 치킨집의 1 ~ m개까지의 조합이 나올때까지 반복

 

 


 

2. 코드

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;

vector<pair<int, int >>housePoint;
vector<pair<int, int>>chickenPoint;
int n, m, answer = INT_MAX;

int getDistance(pair<int, int>a, pair<int, int >b)
{
	return abs(b.first - a.first) + abs(b.second - a.second);
}

int getChickenRoad(const vector<int>& selectChickenShop)
{
	int SumOfchickenRoad = 0;
	if (selectChickenShop.size() == 0)
		return INT_MAX;
	for (int i = 0; i < (int)housePoint.size(); i++)
	{
		int chickenRoad = INT_MAX;
		for (int j = 0; j < (int)selectChickenShop.size(); j++)
		{
			chickenRoad = min(chickenRoad, getDistance(housePoint[i], chickenPoint[selectChickenShop[j]]));
		}
		SumOfchickenRoad += chickenRoad;
	}
	return SumOfchickenRoad;
}

void dfs(int idx, vector<int> selectChickenShop)
{
	if (selectChickenShop.size() > m)
		return;

	answer = min(answer, getChickenRoad(selectChickenShop));

	for (int i = idx; i < (int)chickenPoint.size(); i++)
	{
		selectChickenShop.push_back(i);
		dfs(i + 1, selectChickenShop);
		selectChickenShop.erase(--end(selectChickenShop));
	}
}

int main()
{
	cin >> n >> m;

	//입력
	int value;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			cin >> value;
			if (value == 1)
				housePoint.push_back({ i, j });
			else if (value == 2)
				chickenPoint.push_back({ i, j });
		}
	}

	dfs(0, vector<int>(0));
	
	cout << answer << endl;
	return 0;
}

 


 

3. 후기

 

어떻게 풀지 찾기가 조금 어려웠다.

 

반응형
Comments