https://www.acmicpc.net/problem/15686
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸
www.acmicpc.net
1. Logic
- 먼저 시간 복잡도를 계산해봤을때 넉넉잡아 계산해도 50 * 50 * 13 * 13을 해도 42만정도가 나오기 때문에 충분히 돌 수 있다. 그러므로 완전탐색 문제인 것을 알 수 있다.
폐업시키지 않을 치킨집의 최대 갯수를 준다고 했는데 치킨집은 많으면 많을 수록 좋기 때문에 다 골라준다고 생각하면 된다. 여기서 폐업시킨다는 뜻은 고르지 않는다로 생각하고 치킨집에 대해 조합탐색을 하여 골라진 치킨집과 집 사이의 최단거리를 구하면 된다.
처음엔 최단거리라고 해서 BFS를 생각했지만 중간에 장애물이나 그런것이 없으므로 단순히 좌표만 받아 저장해서 서로간의 치킨 거리를 구해주면 시간복잡도를 더 줄일 수 있다.
2. Code
#include<bits/stdc++.h>
using namespace std;
vector<pair<int, int>> home;
vector<pair<int, int>> kfc;
vector<pair<int, int>> pick;
bool choice[13];
int answer = 0x3f3f3f3f;
int n, m;
int calcDist(pair<int, int> p, pair<int, int> h) {
return abs(p.first - h.first) + abs(p.second - h.second);
}
void solve() {
int temp = 0;
for(int i = 0; i < home.size(); i++) {
int minDist = 0x3f3f3f3f;
for(int j = 0; j < pick.size(); j++) {
minDist = min(minDist, calcDist(pick[j], home[i]));
}
temp += minDist;
}
answer = min(answer, temp);
}
void combination(int k, int cnt) {
if(cnt == m) {
solve();
}
for(int i = k; i < kfc.size(); i++) {
if(choice[i]) continue;
choice[i] = true;
pick.push_back({kfc[i].first, kfc[i].second});
combination(i, cnt+1);
choice[i] = false;
pick.pop_back();
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n >> m;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
int input;
cin >> input;
if(input == 1) home.push_back({i, j});
else if(input == 2) kfc.push_back({i, j});
}
}
combination(0, 0);
cout << answer;
}
3. Feedback
처음 봤을때 문제가 이해가 안되서 약 1주일정도 공부하고 다시 보니까 문제가 이해도 쉽고 잘 풀린것 같다. 부대 안인데 KFC먹고싶다.
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 2638 치즈 C++ :: BFS & Graph & Implementation (1) | 2023.09.18 |
---|---|
[백준/Baekjoon] 15683 감시 C++ :: Brute force & Implementation & Back tracking (2) | 2023.09.18 |
[백준/Baekjoon] 9251 LCS C++ :: Dynamic programming (0) | 2023.09.16 |
[백준/Baekjoon] 2212 센서 C++ :: Greedy (0) | 2023.09.14 |
[백준/Baekjoon] 2812 크게 만들기 C++ :: Data Structure & Greedy (0) | 2023.09.13 |
https://www.acmicpc.net/problem/15686
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸
www.acmicpc.net
1. Logic
- 먼저 시간 복잡도를 계산해봤을때 넉넉잡아 계산해도 50 * 50 * 13 * 13을 해도 42만정도가 나오기 때문에 충분히 돌 수 있다. 그러므로 완전탐색 문제인 것을 알 수 있다.
폐업시키지 않을 치킨집의 최대 갯수를 준다고 했는데 치킨집은 많으면 많을 수록 좋기 때문에 다 골라준다고 생각하면 된다. 여기서 폐업시킨다는 뜻은 고르지 않는다로 생각하고 치킨집에 대해 조합탐색을 하여 골라진 치킨집과 집 사이의 최단거리를 구하면 된다.
처음엔 최단거리라고 해서 BFS를 생각했지만 중간에 장애물이나 그런것이 없으므로 단순히 좌표만 받아 저장해서 서로간의 치킨 거리를 구해주면 시간복잡도를 더 줄일 수 있다.
2. Code
#include<bits/stdc++.h> using namespace std; vector<pair<int, int>> home; vector<pair<int, int>> kfc; vector<pair<int, int>> pick; bool choice[13]; int answer = 0x3f3f3f3f; int n, m; int calcDist(pair<int, int> p, pair<int, int> h) { return abs(p.first - h.first) + abs(p.second - h.second); } void solve() { int temp = 0; for(int i = 0; i < home.size(); i++) { int minDist = 0x3f3f3f3f; for(int j = 0; j < pick.size(); j++) { minDist = min(minDist, calcDist(pick[j], home[i])); } temp += minDist; } answer = min(answer, temp); } void combination(int k, int cnt) { if(cnt == m) { solve(); } for(int i = k; i < kfc.size(); i++) { if(choice[i]) continue; choice[i] = true; pick.push_back({kfc[i].first, kfc[i].second}); combination(i, cnt+1); choice[i] = false; pick.pop_back(); } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { int input; cin >> input; if(input == 1) home.push_back({i, j}); else if(input == 2) kfc.push_back({i, j}); } } combination(0, 0); cout << answer; }
3. Feedback
처음 봤을때 문제가 이해가 안되서 약 1주일정도 공부하고 다시 보니까 문제가 이해도 쉽고 잘 풀린것 같다. 부대 안인데 KFC먹고싶다.
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 2638 치즈 C++ :: BFS & Graph & Implementation (1) | 2023.09.18 |
---|---|
[백준/Baekjoon] 15683 감시 C++ :: Brute force & Implementation & Back tracking (2) | 2023.09.18 |
[백준/Baekjoon] 9251 LCS C++ :: Dynamic programming (0) | 2023.09.16 |
[백준/Baekjoon] 2212 센서 C++ :: Greedy (0) | 2023.09.14 |
[백준/Baekjoon] 2812 크게 만들기 C++ :: Data Structure & Greedy (0) | 2023.09.13 |