일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- python
- 스포티파이
- SECS
- Computer Science
- 회귀
- spotify
- 프로그래머스
- 백준
- SECS-II
- SW Expert Academy
- CS
- Spring
- 자바
- 회원가입
- spring boot
- c
- Spotify Api
- C++
- 파이썬
- MYSQL
- SWEA
- modern c++
- Gem
- linux
- java
- regression
- programmers
- Baekjoon
- Spring JPA
- SECS/GEM
Archives
- Today
- Total
비버놀로지
[BAEKJOON 백준] 15686 치킨 배달 본문
728x90
https://www.acmicpc.net/problem/15686
집과 치킨집과의 거리가 최소로하는 치킨집을 남기는 문제입니다.
재귀를 이용해서 남겨둘 치킨집 수만큼 조합을 하고, 남겨진 치킨집을 이용해서 집에서 가까운 치킨집을 찾아 치킨거리를 합하게 됩니다.
그리고 그중에서 치킨집거리를 최소로 할 수 있는 치킨집 조합을 선택하고, 최소인 치킨집 거리를 출력하는 문제입니다.
import java.util.Scanner;
public class Main {
static class Point { // 치킨집 위치와 집의 위치를 저장해줄 클래스
int x, y;
public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
static Point chickenarr[]; // 치킨집 위치
static Point housearr[]; // 집 위치
static Point temp[];
static int cnt, cnt2;
static int N, M;
static int result = 99999999;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
temp = new Point[M];
chickenarr = new Point[13];
housearr = new Point[2 * N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int temp = sc.nextInt();
if (temp == 2) {
chickenarr[cnt++] = new Point(i, j); // 입력이 2인 곳을 찾아 치킨집 배열에 넣어줍니다.
} else if (temp == 1) {
housearr[cnt2++] = new Point(i, j); // 입력이 1인 곳을 찾아 집 배열에 넣어줍니다.
}
}
}
solve(0, 0);
System.out.println(result);
}
private static void solve(int count, int start) {
// TODO Auto-generated method stub
if (count == M) { // 치킨집 수가 M개가 되면 아래와 같이 집과 치킨집과의 거리를 구하고, 최소값을 찾습니다.
int answer = 0;
for (int i = 0; i < cnt2; i++) {
int no = 9999999;
for (int j = 0; j < M; j++) { // 집과 치킨집 사이 거리가 가장짧은 치킨집을 찾아 줍니다.
if (no > Math.abs(housearr[i].x - temp[j].x) + Math.abs(housearr[i].y - temp[j].y)) {
no = Math.abs(housearr[i].x - temp[j].x) + Math.abs(housearr[i].y - temp[j].y);
}
}
answer += no; // 그거리를 더해줍니다.
}
if (result > answer) { // 치킨들과 집들과의 거리가 최소가 되는 값을 찾아줍니다.
result = answer;
}
return;
}
for (int i = start; i < cnt; i++) {
temp[count] = chickenarr[i];
solve(count + 1, i + 1);
}
}
}
728x90
'ALGORITM > JAVA' 카테고리의 다른 글
[SWEA SW Expert Academy] 1249 보급로 (0) | 2020.12.01 |
---|---|
[SWEA SW Expert Academy] 4013 특이한 자석 (0) | 2020.12.01 |
[BAEKJOON 백준] 17406 배열돌리기 4 (0) | 2020.08.31 |
[BAEKJOON 백준] 1992 쿼드트리 (0) | 2020.08.30 |
[BAEKJOON 백준] 1074 Z (0) | 2020.08.30 |
Comments