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

 

/*
0은 빈
1이 집
2가 치킨

치킨집 좌표를 1차원 벡터에 놓고
집도 동일하다.
경우의 수 - 조합

branch는 치킨집 모든 갯수.
depth 는 M개
depth가 M개 일 때 집과 치킨집 사이의 거리가 가장 작은 것을 선정하여
result 에 합산하고 Min값과 비교하여 가장 작은 값을 결과값으로 출력.

*/

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

struct point {
	int x;
	int y;
};
vector<point>home;
vector<point>restruant;
vector<point>pickedRestruant;
int N, M;
int diff(point h, point r) {
	return abs(h.x - r.x) + abs(h.y - r.y);
}
int resultMin = 10e7;
void combi(int lv, int m) {
	if (m == M) { // 폐업시키지 않을 집 M개일 떄
		int result = 0;
		for (const auto & h : home){
			int minDist = 10e7;
			for (const auto& r : pickedRestruant) {
				minDist = min(minDist, diff(h, r));
			}
			result += minDist;
		}

		resultMin = min(result, resultMin);
		return;
	}
	for (int idx = lv; idx < restruant.size(); ++idx) {
		pickedRestruant.push_back({ restruant[idx].x, restruant[idx].y });
		combi(idx + 1, m+1);
		pickedRestruant.pop_back();
	}
}

int main(void) {
	cin >> N >> M;
	for (int y = 0; y < N; ++y) {
		for (int x = 0; x < N; ++x) {
			int val;
			cin >> val;
			if (val == 1) //집
				home.push_back({ y,x });
			if (val == 2) { // 치킨
				restruant.push_back({ y,x });
			}
		}
	}
	combi(0, 0);
	cout << resultMin << endl;
}

풀이 설명 ( 못풀었다면 못푼이유 )

dfs 조합으로 풀이했다. 폐업시키지 않을 치킨 집 수에 대한 경우의 수를 전체 치킨 집 수에서 찾아서 해당 경우들 안에서 치킨거리 (집-치킨집 간 거리가 제일 작은 거리)들 합산하여 각 경우의 치킨거리 총합들을 비교하여 가장 작은 총합 거리를 구한다.

그런데, 시간초과가 왜 나는지 모르겠다. —> 치킨집을 2, 집을 1로 오해했던게 원인…

'PS > 백준' 카테고리의 다른 글

[한양대 HCPC 2023] Pipelined (백준: 30874번)  (0) 2024.11.01
1062번 가르침 [다시보기]  (0) 2024.07.24
10844번 쉬운 계단 수  (0) 2024.07.08
한국이 그리울 땐 서버에 접속하지  (0) 2023.08.26
1931번 회의실배정 (V)  (0) 2023.07.19

+ Recent posts