Coding Is My Life

코딩은 인생

삼성sw역량테스트 기출문제

치킨 배달(백준 15686번)

산기대 컴공 2021. 5. 24. 22:08
728x90

문제

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

 

15686번: 치킨 배달

크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸

www.acmicpc.net

이 문제를 처음 봤을 때 그냥 간단한 브루트포스 문제인 줄 알고 풀었다가 시간초과가 계속 나와서 다른 블로그를 보고 서야 풀 수 있었다... 길이를 구하는 것을 처음에는 집,치킨집 좌표를 기억해서 구하는 식으로 했다가 시간초과가 나서 bfs로 했는데 런타임에러가 떠서 결국에는 블로그를 찾아서 풀었다.

알고리즘 설명

1. 집,치킨집의 좌표를 벡터에 저장한다.

2. visit 배열을 만들어서 치킨집을 M에 맞게 뽑는다.

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
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
int N,M,Min = 987654321;
int map[51][51];
bool visit[13];
vector<pair<int,int>> chicken;
vector<pair<int,int>> home;
int absolute_value(int a,int b){
    int result = a-b;
    if(result<0){result = result*-1;}
    return result;
}
void dfs(int idx,int cnt){
    if(cnt == M){
        int result = 0;
        for(int i = 0;i<home.size();i++){
            int dis = 987654321;
            for(int j = 0;j<chicken.size();j++){
                if(visit[j] == true){
                    int y = absolute_value(home[i].first,chicken[j].first);
                    int x = absolute_value(home[i].second,chicken[j].second);
                    dis = min(dis,y+x);
                }
            }
            result = result+dis;
        }
        Min = min(Min,result);
        return;
    }
    else{
        if(idx == chicken.size())
            return;
        visit[idx] = true;
        dfs(idx+1,cnt+1);
        visit[idx] = false;
        dfs(idx+1,cnt);
    }
}
int main(int argc, char* argv[]){
    cin >> N >> M;
    for(int i = 0;i<N;i++){
        for(int j = 0;j<N;j++){
            cin >> map[i][j];
            if(map[i][j] == 1){
                home.push_back(make_pair(i,j));
            }
            else if(map[i][j] == 2){
                chicken.push_back(make_pair(i,j));
            }
        }
    }
    dfs(0,0);
    cout << Min;
}
cs
728x90