ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 치킨 배달
    Algorithm/BOJ 2020. 2. 8. 18:04

    [15686] 치킨 배달

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

    • 치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이다.
    • 도시의 치킨 거리는 모든 집의 치킨 거리의 합이다.
    • 도시의 치킨집 중 최대 M개를 고르고, 나머지 치킨집은 모두 폐업시키려 한다.
    • 도시의 치킨 거리가 가장 작게 될지 구하는 프로그램을 작성하시오

     

     

    Solution

    • permutation()으로  치킨집 중 M개만 골라 치킨거리를 계산한다.

     

     

    소스코드

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    import java.util.StringTokenizer;
    
    public class Main {
    	static int n, m, min;
    	static int[] a, temp;
    	static List<Node> chicken;
    	static List<Node> home;
    
    	static class Node {
    		int x, y;
    
    		public Node(int x, int y) {
    			this.x = x;
    			this.y = y;
    		}
    
    	}
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		StringTokenizer st = new StringTokenizer(sc.nextLine());
    		n = stoi(st.nextToken());
    		m = stoi(st.nextToken());
    		init();
    		int count = 0;
    		for (int i = 1; i <= n; i++) {
    			st = new StringTokenizer(sc.nextLine());
    			for (int j = 1; j <= n; j++) {
    				int info = stoi(st.nextToken());
    				if (info == 1) {
    					home.add(new Node(i, j));
    				} else if (info == 2) {
    					chicken.add(new Node(i, j));
    					count++;
    				}
    			}
    		}
    		min = Integer.MAX_VALUE;
    		permutation(0, 0, count);
    		System.out.println(min);
    
    	}
    
    	public static void simulation() {
    		int sum = 0;
    		for (int i = 0; i < home.size(); i++) {
    			int pick = Integer.MAX_VALUE;
    			for (int j = 0; j < a.length; j++) {
    				int temp = Math.abs(home.get(i).x - chicken.get(a[j]).x)
    						+ Math.abs(home.get(i).y - chicken.get(a[j]).y);
    				pick = Math.min(pick, temp);
    			}
    			sum += pick;
    		}
    		min = Math.min(min, sum);
    	}
    
    	public static void permutation(int depth, int start, int size) {
    		if (depth == m) {
    			simulation();
    			return;
    		}
    		for (int i = start; i < size; i++) {
    			a[depth] = i;
    			permutation(depth + 1, i + 1, size);
    		}
    	}
    
    	public static void init() {
    		chicken = new ArrayList<>();
    		home = new ArrayList<>();
    		a = new int[m];
    	}
    
    	public static int stoi(String s) {
    		return Integer.parseInt(s);
    	}
    }

    'Algorithm > BOJ' 카테고리의 다른 글

    [BOJ] 캠프 준비  (0) 2020.02.08
    [BOJ] 연구소 2  (0) 2020.02.08
    [BOJ] 배열 돌리기 4  (0) 2020.02.08
    [BOJ] DSLR  (0) 2020.02.07
    [BOJ] 숨바꼭질 2  (0) 2020.02.07

    댓글

Designed by Tistory.