J

[JAVA] BOJ ๋ฐฑ์ค€ 15686 ์น˜ํ‚จ ๊ฑฐ๋ฆฌ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ’ป Samsung SW Expert

[JAVA] BOJ ๋ฐฑ์ค€ 15686 ์น˜ํ‚จ ๊ฑฐ๋ฆฌ

snowball๐Ÿฐ 2023. 1. 29. 21:55

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

๋ฌธ์ œ

ํฌ๊ธฐ๊ฐ€ N×N์ธ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์‹œ๋Š” 1×1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ, ์น˜ํ‚จ์ง‘, ์ง‘ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋„์‹œ์˜ ์นธ์€ (r, c)์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , rํ–‰ c์—ด ๋˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ r๋ฒˆ์งธ ์นธ, ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ c๋ฒˆ์งธ ์นธ์„ ์˜๋ฏธํ•œ๋‹ค. r๊ณผ c๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

์ธ๋ฑ์Šค๋ฅผ 0์ด ์•„๋‹Œ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ผ๋Š” ๋ง. 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋„ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š”๋ฐ์—๋Š” ์ „ํ˜€ ์ง€์žฅ์ด ์—†๋‹ค.

์ด ๋„์‹œ์— ์‚ฌ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์น˜ํ‚จ์„ ๋งค์šฐ ์ข‹์•„ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์‚ฌ๋žŒ๋“ค์€ "์น˜ํ‚จ ๊ฑฐ๋ฆฌ"๋ผ๋Š” ๋ง์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” ์ง‘๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์น˜ํ‚จ์ง‘ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์ด๋‹ค. ์ฆ‰, ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” ์ง‘์„ ๊ธฐ์ค€์œผ๋กœ ์ •ํ•ด์ง€๋ฉฐ, ๊ฐ๊ฐ์˜ ์ง‘์€ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” ๋ชจ๋“  ์ง‘์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์ด๋‹ค.

์ž„์˜์˜ ๋‘ ์นธ (r1, c1)๊ณผ (r2, c2) ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋Š” |r1-r2| + |c1-c2|๋กœ ๊ตฌํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ง€๋„๋ฅผ ๊ฐ–๋Š” ๋„์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

0 2 0 1 0
1 0 1 0 0
0 0 0 0 0
0 0 0 1 1
0 0 0 1 2

0์€ ๋นˆ ์นธ, 1์€ ์ง‘, 2๋Š” ์น˜ํ‚จ์ง‘์ด๋‹ค.

(2, 1)์— ์žˆ๋Š” ์ง‘๊ณผ (1, 2)์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” |2-1| + |1-2| = 2, (5, 5)์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” |2-5| + |1-5| = 7์ด๋‹ค. ๋”ฐ๋ผ์„œ, (2, 1)์— ์žˆ๋Š” ์ง‘์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” 2์ด๋‹ค.

(5, 4)์— ์žˆ๋Š” ์ง‘๊ณผ (1, 2)์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” |5-1| + |4-2| = 6, (5, 5)์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” |5-5| + |4-5| = 1์ด๋‹ค. ๋”ฐ๋ผ์„œ, (5, 4)์— ์žˆ๋Š” ์ง‘์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋Š” 1์ด๋‹ค.

์ด ๋„์‹œ์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘์€ ๋ชจ๋‘ ๊ฐ™์€ ํ”„๋žœ์ฐจ์ด์ฆˆ์ด๋‹ค. ํ”„๋ Œ์ฐจ์ด์ฆˆ ๋ณธ์‚ฌ์—์„œ๋Š” ์ˆ˜์ต์„ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์น˜ํ‚จ์ง‘์„ ํ์—…์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์˜ค๋žœ ์—ฐ๊ตฌ ๋์— ์ด ๋„์‹œ์—์„œ ๊ฐ€์žฅ ์ˆ˜์ต์„ ๋งŽ์ด ๋‚ผ ์ˆ˜ ์žˆ๋Š”  ์น˜ํ‚จ์ง‘์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ M๊ฐœ๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ์•„๋‚ด์—ˆ๋‹ค.

๋„์‹œ์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘ ์ค‘์—์„œ ์ตœ๋Œ€ M๊ฐœ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋‚˜๋จธ์ง€ ์น˜ํ‚จ์ง‘์€ ๋ชจ๋‘ ํ์—…์‹œ์ผœ์•ผ ํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ณ ๋ฅด๋ฉด, ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ž‘๊ฒŒ ๋ ์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(2 ≤ N ≤ 50)๊ณผ M(1 ≤ M ≤ 13)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๋„์‹œ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋„์‹œ์˜ ์ •๋ณด๋Š” 0, 1, 2๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , 0์€ ๋นˆ ์นธ, 1์€ ์ง‘, 2๋Š” ์น˜ํ‚จ์ง‘์„ ์˜๋ฏธํ•œ๋‹ค. ์ง‘์˜ ๊ฐœ์ˆ˜๋Š” 2N๊ฐœ๋ฅผ ๋„˜์ง€ ์•Š์œผ๋ฉฐ, ์ ์–ด๋„ 1๊ฐœ๋Š” ์กด์žฌํ•œ๋‹ค. ์น˜ํ‚จ์ง‘์˜ ๊ฐœ์ˆ˜๋Š” M๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 13๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ์—…์‹œํ‚ค์ง€ ์•Š์„ ์น˜ํ‚จ์ง‘์„ ์ตœ๋Œ€ M๊ฐœ๋ฅผ ๊ณจ๋ž์„ ๋•Œ, ๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ฝ”๋“œ

์ „์ฒด ์ฝ”๋“œ

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

public class BOJ_15686 {
    static int N;
    static int M;
    static int chicken;
    static int[][] chickens;
    static int[][] city;
    static int home;
    static int[][] homes;
    static int result;

    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        city = new int[N][N];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(bf.readLine(), " ");
            for (int j = 0; j < N; j++) {
                city[i][j] = Integer.parseInt(st.nextToken());
                if (city[i][j] == 2)
                    chicken++;
                if (city[i][j] == 1)
                    home++;
            }
        }
        chickens = new int[chicken][3];
        homes = new int[home][2];
        int h = 0;
        int c = 0;
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++) {
                if (city[i][j] == 2) {
                    chickens[c][0] = i;
                    chickens[c++][1] = j;
                }
                if (city[i][j] == 1) {
                    homes[h][0] = i;
                    homes[h++][1] = j;
                }
            }
        result = Integer.MAX_VALUE;
        dfs(0, 0);
        sb.append(result).append("\\n");
        System.out.println(sb.toString());
    }

    static void dfs(int market, int x) {
        if (market == M) {
            account();
            return;
        }

        for (int i = x; i < chicken; i++) {
            if (chickens[i][2] == 1)
                continue;
            chickens[i][2] = 1;
            dfs(market + 1, i);
            chickens[i][2] = 0;
        }
    }

    static void account() {
        int loads = 0;
        for (int i = 0; i < home; i++) {
            int load = Integer.MAX_VALUE;
            for (int j = 0; j < chicken; j++) {
                if (chickens[j][2] == 0)
                    continue;
                if (load > Math.abs(homes[i][0] - chickens[j][0]) + Math.abs(homes[i][1] - chickens[j][1]))
                    load = Math.abs(homes[i][0] - chickens[j][0]) + Math.abs(homes[i][1] - chickens[j][1]);
            }
            loads += load;
        }
        if (loads < result)
            result = loads;
    }
}

ํ•œ์ค„์”ฉ ์‚ดํŽด ๋ณด์ž!

static int N;
static int M;
static int chicken;
static int[][] chickens;
static int[][] city;
static int home;
static int[][] homes;
static int result;

ํด๋ž˜์Šค ๋ณ€์ˆ˜๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์—ฌ๊ธฐ์„œ chicken์€ ์น˜ํ‚จ์ง‘์˜ ๊ฐœ์ˆ˜๋ฅผ chickens ๋ฐฐ์—ด์€ ์น˜ํ‚จ์ง‘์˜ ์œ„์น˜์™€ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

home๋„ ์ง‘์˜ ๊ฐœ์ˆ˜์™€ ์ง‘์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

city๋ฐฐ์—ด์€ ์ž…๋ ฅ๋ฐ›์€ ๋งˆ์„ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

for (int i = 0; i < N; i++) {
      st = new StringTokenizer(bf.readLine(), " ");
      for (int j = 0; j < N; j++) {
          city[i][j] = Integer.parseInt(st.nextToken());
          if (city[i][j] == 2)
              chicken++;
          if (city[i][j] == 1)
              home++;
      }
  }

for๋ฌธ์„ ํ†ตํ•ด ์ž…๋ ฅ ๋ฐ›์œผ๋ฉด์„œ 2์ธ ๊ฒฝ์šฐ(์น˜ํ‚จ์ง‘์ธ ๊ฒฝ์šฐ) chicken ๋ณ€์ˆ˜๋ฅผ ์ฆ๊ธฐ์‹œํ‚ค๊ณ  ์ง‘์ธ ๊ฒฝ์šฐ home์„ ์ฆ๊ฐ€์‹œ์ผœ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค.

chickens = new int[chicken][3];
homes = new int[home][2];
int h = 0;
int c = 0;
for (int i = 0; i < N; i++)
    for (int j = 0; j < N; j++) {
        if (city[i][j] == 2) {
            chickens[c][0] = i;
            chickens[c++][1] = j;
        }
        if (city[i][j] == 1) {
            homes[h][0] = i;
            homes[h++][1] = j;
        }
    }
result = Integer.MAX_VALUE;

๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด์ฃผ๊ณ  h, c ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ตœ์†Œ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— result๋ฅผ ๊ฐ€์žฅ ํฐ ์ •์ˆ˜๊ฐ’์œผ๋กœ ์„ธํŒ…ํ•œ๋‹ค.

static void dfs(int market, int x) {
    if (market == M) {
        account();
        return;
    }

    for (int i = x; i < chicken; i++) {
        if (chickens[i][2] == 1)
            continue;
        chickens[i][2] = 1;
        dfs(market + 1, i);
        chickens[i][2] = 0;
    }
}

market์€ ์šด์˜ํ•  ์น˜ํ‚จ ์ง‘์˜ ๊ฐœ์ˆ˜์ด๋‹ค. ์šด์˜ํ•  ์น˜ํ‚จ ์ง‘ M๊ฐœ๋ฅผ ๋ชจ๋‘ ์„ ํƒํ•˜๋ฉด ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ returnํ•˜์—ฌ ์ข…๋ฃŒํ•œ๋‹ค.

for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์น˜ํ‚จ์ง‘ ์šด์˜ ์ƒํƒœ๋ฅผ 1(์šด์˜)์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๊ณ  ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ๋’ค ๋‹ค์‹œ ์›๋ž˜ ๊ฐ’์ธ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

์ด๋•Œ if๋ฌธ์„ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ™์€ ์น˜ํ‚จ์ง‘ M๊ฐœ๋ฅผ ์„ ํƒํ•œ ๋’ค account๋ฅผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ์ด๋ฏธ 1๋กœ ์„ธํŒ…ํ•œ ์น˜ํ‚จ์ง‘์€ for๋ฌธ์—์„œ ์กฐ์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

static void account() {
    int loads = 0;
    for (int i = 0; i < home; i++) {
        int load = Integer.MAX_VALUE;
        for (int j = 0; j < chicken; j++) {
            if (chickens[j][2] == 0)
                continue;
            if (load > Math.abs(homes[i][0] - chickens[j][0]) + Math.abs(homes[i][1] - chickens[j][1]))
                load = Math.abs(homes[i][0] - chickens[j][0]) + Math.abs(homes[i][1] - chickens[j][1]);
        }
        loads += load;
    }
    if (loads < result)
        result = loads;
}

accountํ•จ์ˆ˜๋Š” ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์ด๋•Œ loads๋Š” ์ด ์น˜ํ‚จ ๊ฑฐ๋ฆฌ ๊ฐ’์ด๊ณ  load๋Š” ํ•œ ์ง‘์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ์ด๋‹ค.

์ตœ์†Œ๊ฐ’์„ ๊ตฌํ• ๊ฒƒ์ด๋ฏ€๋กœ ์ฒ˜์Œ์— ์ •์ˆ˜์˜ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

์น˜ํ‚จ์ง‘์ด ์šด์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ if๋ฌธ์œผ๋กœ ํ™•์ธํ•œ ๋’ค continue๋กœ ๊ทธ ์น˜ํ‚จ์ง‘์€ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋งŒ์•ฝ ๊ณ„์‚ฐ๋œ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ ๊ฐ’์ด ์›๋ž˜์˜ ๊ฐ’ ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ์ง‘์—์„œ ๊ณ„์‚ฐ๋œ ์ตœ์†Œ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ load ๋ณ€์ˆ˜์— ๋”ํ•œ๋‹ค.

result์˜ ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

 

15686๋ฒˆ: ์น˜ํ‚จ ๋ฐฐ๋‹ฌ

ํฌ๊ธฐ๊ฐ€ N×N์ธ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์‹œ๋Š” 1×1ํฌ๊ธฐ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ, ์น˜ํ‚จ์ง‘, ์ง‘ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋„์‹œ์˜ ์นธ์€ (r, c)์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ , rํ–‰ c์—ด ๋˜๋Š” ์œ„์—์„œ๋ถ€ํ„ฐ r๋ฒˆ์งธ ์นธ

www.acmicpc.net

 

Comments