-
백준 - 치킨 배달 (15686) [C++]문제 풀이/백준 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; }
반응형'문제 풀이 > 백준' 카테고리의 다른 글
백준 - 아기 상어 (16236) [C++] (0) 2024.03.27 백준 - 인구 이동 (16234) [C++] (0) 2024.03.26 백준 - 드래곤 커브 (15685) [C++] (0) 2024.03.25 백준 - 사다리 조작 (15684) [C++] (2) 2024.03.25 백준 - 경사로 (14890) [C++] (0) 2024.03.19