개발자-H 입니다.

BOJ(15686) - 치킨 배달 (JAVA) 본문

Algorithm/문제 풀이

BOJ(15686) - 치킨 배달 (JAVA)

개발자-H 2021. 9. 29. 07:54

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

 

15686번: 치킨 배달

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

www.acmicpc.net

 

 

  • 백트래킹 완전탐색으로 구할 수 있는 문제이다.
  • 초반에 시간 초과로 꾀 고생을 했는데 집을 선택하는 순서는 관계 없기 때문에 오름 차순 식으로 풀면 통과 할 수 있다.
  • 결론적으로 아래의 문제에서 입력 형식과 결과 도출만 달라진 문제였다.

 

import java.io.*;
import java.util.*;

public class Main {
    public static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    private static int N, M;
    private static int minPathChickens = Integer.MAX_VALUE;
    private static List<Node> chickens = new ArrayList<>();
    private static List<Node> homes = new ArrayList<>();
    private static boolean[] visit;

    public static void main(String[] args) throws Exception {
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                int type = Integer.parseInt(st.nextToken());

                if (type == 2) {
                    chickens.add(new Node(i, j));
                } else if (type == 1) {
                    homes.add(new Node(i, j));
                }
            }
        }

        visit = new boolean[chickens.size()];
        dp(0, -1);
        System.out.println(minPathChickens);
    }

    private static void dp(int depth, int pre) {
        if (depth == M) {

            int total = 0;
            for (int i = 0; i < homes.size(); i++) {
                int minPathFromHome = Integer.MAX_VALUE;
                Node home = homes.get(i);
                for (int j = 0; j < visit.length; j++) {
                    if (visit[j]) {
                        Node chicken = chickens.get(j);
                        minPathFromHome = Math.min(minPathFromHome,
                                Math.abs(home.y - chicken.y) + Math.abs(home.x - chicken.x));
                    }
                }
                total += minPathFromHome;
            }
            minPathChickens = Math.min(minPathChickens, total);
            return;
        }

        for (int i = depth; i < chickens.size(); i++) {
            if (visit[i] == false && pre < i) {
                visit[i] = true;
                dp(depth + 1, i);
                visit[i] = false;
            }
        }
    }

    static class Node {
        public int y;
        public int x;

        public Node(int y, int x) {
            this.y = y;
            this.x = x;
        }
    }
}

'Algorithm > 문제 풀이' 카테고리의 다른 글

BOJ(13301) - 타일 장식물 (JAVA)  (0) 2021.09.28
BOJ(18429) - 근손실 (JAVA)  (0) 2021.09.27
BOJ(10597) - 순열장난 (JAVA)  (0) 2021.09.26
BOJ - 모든 순열  (0) 2021.09.25
BOJ - 차이를 최대로  (0) 2021.09.24
Comments