반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
11-07 11:40
관리 메뉴

ImJay

[BOJ/Java] 15686. 치킨 배달 본문

알고리즘/BOJ - Java

[BOJ/Java] 15686. 치킨 배달

ImJay 2024. 4. 17. 09:16
반응형

[BOJ/Java] 15686. 치킨 배달

 

15686번: 치킨 배달

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

www.acmicpc.net


문제 해석

이 문제는 도시의 크기 과 치킨집들 중 최대 개를 선택하여, 도시의 치킨 거리를 최소화하는 문제이다. 여기서 치킨 거리란, 각 집에서 가장 가까운 치킨집까지의 거리의 합을 의미한다.

풀이 과정

풀이는 조합과 브루트 포스를 이용한 접근 방식을 채택하였다. 모든 치킨집의 조합을 고려하여, 각 조합마다 모든 집의 치킨 거리를 계산하고 이를 최소화한다.

  • sol 함수는 재귀적으로 치킨집의 조합을 생성하고, 각 조합에 대해 도시의 치킨 거리를 계산한다.
  • 선택된 치킨집에 대해 모든 집의 최소 치킨 거리를 구하고, 이들의 합을 최소화하는 방식으로 문제를 해결한다.
  • 최소 거리는 ans 변수에 저장되며, 각 재귀 호출마다 갱신된다.

코드

package edu.ssafy.im.BOJ.Gold.G5.No15686;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    private int[] sel; // 치킨집 선택 배열
    private int m; // 최대 선택 가능한 치킨집 수
    private int ans = Integer.MAX_VALUE; // 최소 치킨 거리 저장 변수
    List<Point> startList, targetList; // 집과 치킨집 리스트

    public static void main(String[] args) throws IOException {
        new Main().io();
    }

    private void io() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        sel = new int[m]; // 선택 배열 초기화
        startList = new ArrayList<>();
        targetList = new ArrayList<>();
        for (int x = 0; x < n; x++) {
            st = new StringTokenizer(br.readLine());
            for (int y = 0; y < n; y++) {
                int location = Integer.parseInt(st.nextToken());
                if (location == 1) {
                    startList.add(new Point(x, y)); // 집 위치 추가
                } else if (location == 2) {
                    targetList.add(new Point(x, y)); // 치킨집 위치 추가
                }
            }
        }
        sol(0, 0); // 솔루션 함수 호출

        sb.append(ans);

        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }

    private void sol(int i, int k) {
        // 모든 선택이 완료된 경우
        if (k == sel.length) {
            int distanceSum = 0;
            for (int s = 0; s < startList.size(); s++) {
                int sx = startList.get(s).x;
                int sy = startList.get(s).y;

                int shortestDistance = Integer.MAX_VALUE;
                for (int targetIndex : sel) {
                    int tx = targetList.get(targetIndex).x;
                    int ty = targetList.get(targetIndex).y;

                    int distance = Math.abs(sx - tx) + Math.abs(sy - ty); // 맨해튼 거리 계산
                    shortestDistance = Math.min(shortestDistance, distance); // 최소 거리 갱신
                }

                distanceSum += shortestDistance; // 총 거리 합산
            }
            ans = Math.min(ans, distanceSum); // 최소 치킨 거리 갱신
            return;
        }
        if (i == targetList.size()) {
            return;
        }

        // 치킨집 선택
        sel[k] = i;
        sol(i + 1, k + 1); // 선택된 치킨집 포함하여 재귀 호출
        sol(i + 1, k); // 현재 치킨집을 제외하고 재귀 호출
    }

    class Point {
        int x;
        int y;

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

시간 복잡도 분석

이 문제의 시간 복잡도는 이다, 여기서 는 치킨집의 조합 수, 은 최대 선택 가능한 치킨집 수, 는 집의 수를 나타낸다. 모든 조합에 대해 모든 집의 치킨 거리를 계산하기 때문에 계산이 많아질 수 있다.

느낀점

이 문제를 통해 조합과 브루트 포스 방식으로 복잡한 최적화 문제를 해결하는 방법을 배울 수 있었다. 또한, 효율적인 조합 탐색을 위한 가지치기 기법의 중요성을 다시 한번 깨달았다. 이러한 문제 해결 경험은 앞으로 더 어려운 최적화 문제에 대한 접근 방식을 개선하는 데 도움이 될 것이다.

반응형

'알고리즘 > BOJ - Java' 카테고리의 다른 글

[BOJ/Java] 17143. 낚시왕  (0) 2024.04.17
[BOJ/Java] 16236. 아기 상어  (0) 2024.04.17
[BOJ/Java] 2563. 색종이  (0) 2024.04.16
[BOJ/Java] 11286. 절댓값 힙  (0) 2024.04.16
[BOJ/Java] 16935. 배열 돌리기 3  (0) 2024.04.16
Comments