본문 바로가기
백준

[백준 15686] 치킨 배달, C++

by 황인태(intaehwang) 2020. 1. 31.
반응형

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

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸, 왼쪽에서부터 c번째 칸을 의미한다. r과 c는 1부터 시작한다. 이 도시에 사는 사람들은 치킨을 매우 좋아한다. 따라서, 사람들은 "치킨 거리"라는 말을 주로 사용한다. 치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이다. 즉, 치킨 거리는

www.acmicpc.net

/* 그 동안 코딩 업로드를 못했다. 이유를 나열하자면

  1. 오프라인 강의가 3시간 강의라 한번 강의를 들으면 풀어야할 문제가 엄청 많다. 초반에는 2 ~ 3달 전에 풀었던 문제라 다소 쉽게 풀었지만 점점 안 풀었던 문제가 생기고, 또 난이도 상승으로 (일주일에 2번밖에 안가지만) 문제를 풀고 수업에 참여하기가 어려웠다.
  2. spring을 따로 공부하고 있다. 그리고 node.js로 공부할 예정이다. 코딩 문제는 꾸준히 풀고 있었지만, 공부할게 많아져 시간이 부족해 업로드를 하지 않았다. */

 본 문제는 집과 치킨집의 거리를 계산하는 문제다. 문제의 조건에 보면 도시에 있는 치킨집 중에서 최대 M개를 고르고, 나머지 치킨집은 모두 폐업시켜야 한다. 라고 제시되어 있다. 문제를 풀면서 자영업이 쉬운게 아니라는 것을 다시한번 알게 해준다.

  1. 입력을 받으면서 치킨집과 집을 분류한다.
  2. 치킨집 중 M개를 고른다.
  3. 집에서 가장 가까운 치킨집을 고른다.
  4. 3번의 결과를 모두 더하여 가장 작은 치킨 거리를 구한다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <cstdio>
#include <vector>
#include <cstring>
 
using namespace std;
int d[51][51];
int result[101];
int n, m, Min = 1e9;
bool chk[14];
vector<pair<intint>> u;
vector<pair<intint>> v;
 
int dist(int x, int y, int a, int b) {
    int tmp1 = x-a;
    if (tmp1 < 0) tmp1 = -tmp1;
    int tmp2 = y-b;
    if (tmp2 < 0) tmp2 = -tmp2;
    return tmp1 + tmp2;
}
 
void cal(int index, int cnt) {
    if (index == v.size()) {
        if (cnt == m) {
            memset(result, -1sizeof(result));
            // 집에서 가장 가까운 치킨집 계산
            for (int i = 0; i < u.size(); i++) {
                int x = u[i].first;
                int y = u[i].second;
                int ans = 1e9;
                for (int j = 0; j < v.size(); j++) {
                    if (chk[j]) {
                        int a = v[j].first;
                        int b = v[j].second;
                        int tmp = dist(x, y, a, b);
                        if (ans > tmp) ans = tmp;
                    }
                }
                if (result[i] == -1 || result[i] > ans) result[i] = ans;
            }
            int ans = 0;
            // 가장 작은 치킨 거리 구하기
            for (int i = 0; i < u.size(); i++) {
                ans += result[i];
            }
            if (Min > ans) Min = ans;
        }
    }
    else {
        // M개의 치킨집 고르기
        chk[index] = true;
        cal(index+1, cnt+1);
        chk[index] = false;
        cal(index+1, cnt);
    }
}
 
int main() {
    scanf("%d %d"&n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d"&d[i][j]);
            // 집, 치킨집 분류
            if (d[i][j] == 1) u.push_back(make_pair(i, j));
            if (d[i][j] == 2) v.push_back(make_pair(i, j));
        }
    }
    cal(00);
    printf("%d\n", Min);
}
cs
 
반응형

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

[백준 16932] 모양 만들기, C++  (0) 2020.01.31
[백준 16236] 아기 상어, C++  (0) 2020.01.31
[백준 1932] 정수 삼각형, C++  (0) 2020.01.15
[백준 2156] 포도주 시식, C++  (0) 2020.01.14
[백준 1212] 8진수 2진수, C++  (0) 2020.01.13
Buy me a coffeeBuy me a coffee

댓글