티스토리 뷰
얼마전에 코테를 봤는데 개털렸다
N 개 중에 M개를 못뽑는 바보가 여기있다.
결론부터 말하자면 재귀를 사용해서 구해주면 된다.
https://www.acmicpc.net/problem/15686
이 문제를 풀어보자
M개의 가게를 선택하고, 그 조합으로 계산을 해주면 되는 아주 간단한 문제이다. 근데 조합 못구하면 못품
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct store {
int y;
int x;
bool checked;
};
vector<pair<int, int>> houses;
vector<store> stores;
vector<int> selected;
int N, M;
int ans = 1e9;
void calculateDistance() {
int total = 0;
for (int i = 0; i < houses.size(); i++) {
int houseY = houses[i].first;
int houseX = houses[i].second;
int currentMin = 1e9;
for (int j = 0; j < stores.size(); j++) {
if (stores[j].checked) {
// 우리 식당 정상 운영합니다
int storeY = stores[j].y;
int storeX = stores[j].x;
int dist = abs(storeY - houseY) + abs(storeX - houseX);
currentMin = (currentMin > dist) ? dist : currentMin;
}
}
total += currentMin;
}
ans = (ans < total) ? ans : total;
}
void do_selection(int index, int count) {
// dfs + 조합
// 폐업시키지 않을 치킨집 최대 M개 고르기
if (count == M) {
calculateDistance();
}
for (int i = index; i < stores.size(); i++) {
if (!stores[i].checked) {
stores[i].checked = true;
do_selection(i, count + 1);
stores[i].checked = false;
}
}
}
int main() {
cin.tie(0);
cin.sync_with_stdio(false);
cin >> N >> M;
for (int y = 0; y < N; y++) {
for (int x = 0; x < N; x++) {
int temp;
cin >> temp;
if (temp == 1) {
//house!
houses.push_back({ y,x });
}
if (temp == 2) {
stores.push_back(
{ y,x,false }
);
}
}
}
do_selection(0, 0);
cout << ans << "\n";
return 0;
}
void do_selection(int idx, int cnt){
// cnt 가 원하는 만큼 뽑아졌는지 확인 -> 만약 그렇다면 조합을 다 뽑은 거니깐 그 다음 작업을 수행
// idx> 부터 남아 있는 iter를 확인
// 방문 여부를 확인
// 방문 안했으면?
-> 방문 체크하고
-> do_selection(i, cnt++)
// 아무튼 돌고 와서
-> 방문 여부를 해제하고
}
진짜 이런 문제 한번 더 틀리면 사람이 아니다.
'연습' 카테고리의 다른 글
분명 정렬 안 되어 있는 거 같은데 이분 탐색 써야할 때(백준 31848) (0) | 2024.08.29 |
---|---|
어떤 배열을 양쪽으로 확인해 나가기 (1) | 2024.08.29 |
CQRS/CDC Opening (0) | 2024.08.26 |
두 개의 우선순위 큐를 써서 중앙값 찾기 (0) | 2024.08.23 |
어떤 시뮬레이터로서의 우선순위 큐 (0) | 2024.08.22 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 파이썬
- cipher suite
- 불필요한 값 무시하기
- 그리디
- 힙
- Til
- 우선순위큐
- 이것도모르면바보
- endl을절대쓰지마
- Javascript
- requests
- 최대한 간략화하기
- docker-compose update
- SSL
- 위상정렬
- jwt
- django test
- BOJ
- django testcase
- 스택
- 프로그래머스
- factory_pattern
- 백준
- 코딩테스트
- Event Sourcing
- 삽질
- Python
- SQL
- Remote
- vscode
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함