문제 풀이/백준

백준 - 치킨 배달 (15686) [C++]

JJJaewon 2024. 3. 26. 15:28
반응형

이 문제는 구현 문제이다.

 

이 문제에서 시간 복잡도는 13Cm * 2N * m 이다. 

13C6이나 13C7 일 때 1,719로 가장 큰데, 이 때도 약 100만 밖에 되지 않으므로 충분히 1초 안에 풀 수 있다.

 

처음에는 bfs를 생각했으나, 치킨 거리를 수식으로 한번에 알 수 있으므로 시간 복잡도만 늘리는 꼴이었다는 것을 깨달았고 단순히 구현하여 해결할 수 있었다.

 

집과 치킨집을 입력에서 받아 배열로 따로 저장한 뒤, 치킨집에서 M개를 선택해 치킨 거리를 측정하는 방식으로 구현했다.

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

#define MAX 50
#define INF 1000000000

int N, M;
vector<pair<int, int>> house;
vector<pair<int, int>> chicken;

int absolute(int a) {
	if (a < 0) {
		return -a;
	}
	return a;
}

int pick(vector<pair<int, int>> &temp, int index) {
	if (temp.size() == M) {
		// some action
		int result = 0;

		for (pair<int, int> &presentHouse : house) {
			int dist = INF;

			for (pair<int, int> &chick : temp) {
				int presentDist = absolute(chick.first - presentHouse.first)
					+ absolute(chick.second - presentHouse.second);
				
				dist = min(dist, presentDist);
			}

			result += dist;
		}

		return result;
	}

	int result = INF;
	for (int i = index + 1; i < chicken.size(); i++) {
		temp.push_back(chicken[i]);
		result = min(result, pick(temp, i));
		temp.pop_back();
	}

	return result;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> N >> M;

	for (int y = 1; y <= N; y++) {
		for (int x = 1; x <= N; x++) {
			int num;
			cin >> num;

			if (num == 1) {
				house.push_back({ y, x });
			} else if (num == 2) {
				chicken.push_back({ y, x });
			}
		}
	}

	vector<pair<int, int>> temp;
	int answer = pick(temp, -1);
	cout << answer << '\n';

	return 0;
}
반응형