๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Java] 10971๋ฒˆ: ์™ธํŒ์› ์ˆœํšŒ 2

๐ŸŒŽ Link : https://www.acmicpc.net/problem/10971

 

10971๋ฒˆ: ์™ธํŒ์› ์ˆœํšŒ 2

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 10) ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋น„์šฉ ํ–‰๋ ฌ์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ–‰๋ ฌ์˜ ์„ฑ๋ถ„์€ 1,000,000 ์ดํ•˜์˜ ์–‘์˜ ์ •์ˆ˜์ด๋ฉฐ, ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” 0์ด ์ฃผ์–ด์ง„๋‹ค. W[i][j]๋Š” ๋„์‹œ i์—์„œ j

www.acmicpc.net


๐Ÿ’ก ์ ‘๊ทผ ๋ฐฉ๋ฒ•

1. ๋ฌธ์ œ ์ดํ•ด

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  N๊ฐœ์˜ ๋„์‹œ๋ฅผ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ•˜๋Š” ์ตœ์†Œ์˜ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด 1->2->3->4->1 ์ด๋ ‡๊ฒŒ ๋ฐฉ๋ฌธ๊ฐ€๋Šฅํ•˜๋‹ค. ์—ฌ๊ธฐ์„œ ํฌ์ธํŠธ๊ฐ€ ์žˆ๋‹ค.

  1. ์–ด๋Š ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•ด N๊ฐœ์˜ ๋„์‹œ๋ฅผ ๋ชจ๋‘ ๊ฑฐ์ณ ๋‹ค์‹œ ์›๋ž˜์˜ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋Š” ์ˆœํšŒ ์—ฌํ–‰ ๊ฒฝ๋กœ๋ฅผ ๊ณ„ํš
    • N = 4 ์ผ๊ฒฝ์šฐ 1๋ฒˆ ๋„์‹œ๋ฅผ ์‹œ์ž‘ํ•ด์„œ ์ˆœํšŒํ•˜๊ณ , ๊ทธ๋‹ค์Œ 2๋ฒˆ ๋„์‹œ๋ฅผ ์‹œ์ž‘,... ๋งˆ์ง€๋ง‰ 4๋ฒˆ ๋„์‹œ๋ฅผ ์‹œ์ž‘
  2. ๋‹จ, ํ•œ ๋ฒˆ ๊ฐ”๋˜ ๋„์‹œ๋กœ๋Š” ๋‹ค์‹œ ๊ฐˆ ์ˆ˜ ์—†๋‹ค.
    • 1->2->1->3->4->1 ๋ถˆ๊ฐ€๋Šฅ
    • ๋งจ ๋งˆ์ง€๋ง‰์— ์—ฌํ–‰์„ ์ถœ๋ฐœํ–ˆ๋˜ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์€ ์˜ˆ์™ธ
4
1: 0 10 15 20
2: 5  0  9 10
3: 6 13  0 12
4: 8  8  9  0

return 35

 

 

๋„์‹œ 1 → ๋„์‹œ 2 → ๋„์‹œ 4 → ๋„์‹œ 3 → ๋„์‹œ 1 ์ด๋™ ๋น„์šฉ:

10(๋„์‹œ 1์—์„œ 2๋กœ) + 10(๋„์‹œ 2์—์„œ 4๋กœ) + 9(๋„์‹œ 4์—์„œ 3์œผ๋กœ) + 6(๋„์‹œ 3์—์„œ 1๋กœ) = 35

 

 

2. ๋ฌธ์ œ ํ’€์ด

  • ์–ด๋Š ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•ด N๊ฐœ์˜ ๋„์‹œ๋ฅผ ๋ชจ๋‘ ๊ฑฐ์ณ ๋‹ค์‹œ ์›๋ž˜์˜ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋Š” ์ˆœํšŒ ์—ฌํ–‰ ๊ฒฝ๋กœ๋ฅผ ๊ณ„ํš
    • for ๋ฐ˜๋ชฉ๋ฌธ์„ ์‚ฌ์šฉํ•ด ์‹œ์ž‘ ๋„์‹œ๋ฅผ ์„ค์ •ํ•˜๊ณ  isVisited๋ฅผ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค€๋‹ค.
for (int i = 0; i < N; i++) {
    isVisited = new boolean[N];
    isVisited[i] = true;
    backtracking(i, i, 0, 0);
    
    // backtracking(int start, int now, int depth, int cost)
}
  • ๋‹จ, ํ•œ ๋ฒˆ ๊ฐ”๋˜ ๋„์‹œ๋กœ๋Š” ๋‹ค์‹œ ๊ฐˆ ์ˆ˜ ์—†๋‹ค.
    • isVisited ๋ผ๋Š” boolean []์„ ๋งŒ๋“ค์–ด์„œ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•˜๊ณ  backtracking์— ์ ์šฉํ•  ๊ณ„ํš์ด๋‹ค.
for (int i = 0; i < N; i++) {
    if (!isVisited[i] && arr[now][i] != 0) {
        isVisited[i] = true;
        backtracking(start, i, depth + 1, cost + arr[now][i]);
        isVisited[i] = false;
    }
}

 

์‹œ์ž‘ ๋„์‹œ๋ฅผ ํฌํ•จํ•˜์—ฌ N๊ฐœ์˜ ๋„์‹œ๋ฅผ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ์˜ ๊ฐ’ depth๊ฐ€ N-1 ์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒˆ์ถœ์กฐ๊ฑด์œผ๋กœ ์„ค์ •ํ•ด ์คฌ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์€ ๋งž์ง€๋งŒ ๋งˆ์ง€๋ง‰ ๋„์‹œ์—์„œ์˜ ์ถœ๋ฐœ ๋„์‹œ๋กœ ๋‹ค์‹œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ทธ ๊ฐ’์„ ๋”ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

if (depth == N - 1 && arr[now][start] != 0) {
    answer = Math.min(answer, cost + arr[now][start]);
    return;
}

๐Ÿ— ํ’€์ด ์ฝ”๋“œ

1์ฐจ ํ’€์ด์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {

    static int N, answer;
    static boolean[] isVisited;
    static int[][] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        answer = Integer.MAX_VALUE;
        arr = new int[N][N];

        for (int i = 0; i < N; i++) {
            arr[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        }

        for (int i = 0; i < N; i++) {
            isVisited = new boolean[N];
            isVisited[i] = true;
            backtracking(i, i, 0, 0);
        }

        System.out.println(answer);
    }

    private static void backtracking(int start, int now, int depth, int cost) {
        if (depth == N - 1 && arr[now][start] != 0) {
            answer = Math.min(answer, cost + arr[now][start]);
            return;
        }

        for (int i = 0; i < N; i++) {
            if (!isVisited[i] && arr[now][i] != 0) {
                isVisited[i] = true;
                backtracking(start, i, depth + 1, cost + arr[now][i]);
                isVisited[i] = false;
            }
        }
    }
}

 

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ์‹ ๊ธฐํ•œ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ ์–ด๋Š ๋„์‹œ๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์‚ผ์•„๋„ ์ตœ์†Œ๋น„์šฉ์€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์ ์šฉํ•˜๋ฉด ๊ตณ์ด for๋ฌธ์„ ๋Œ๋ ค์„œ ๋ชจ๋“  ๋„์‹œ๋ฅผ ์ถœ๋ฐœํ•˜์ง€ ์•Š๊ณ  1๋ฒˆ ๋„์‹œ๋งŒ ์‹œ์ž‘ํ•ด๋„ ๊ฐ™์€ ์ตœ์†Œ๋น„์šฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถœ์ฒ˜ : https://lotuslee.tistory.com/92

 

2์ฐจ ํ’€์ด์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {

    static int N, answer;
    static boolean[] isVisited;
    static int[][] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        N = Integer.parseInt(br.readLine());
        answer = Integer.MAX_VALUE;
        arr = new int[N][N];

        for (int i = 0; i < N; i++) {
            arr[i] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        }

//        for (int i = 0; i < N; i++) {
//            isVisited = new boolean[N];
//            isVisited[i] = true;
//            backtracking(i, i, 0, 0);
//        }
        
        isVisited = new boolean[N];
        isVisited[0] = true;
        backtracking(0, 0, 0, 0);

        System.out.println(answer);
    }

    private static void backtracking(int start, int now, int depth, int cost) {
        if (depth == N - 1 && arr[now][start] != 0) {
            answer = Math.min(answer, cost + arr[now][start]);
            return;
        }

        for (int i = 0; i < N; i++) {
            if (!isVisited[i] && arr[now][i] != 0) {
                isVisited[i] = true;
                backtracking(start, i, depth + 1, cost + arr[now][i]);
                isVisited[i] = false;
            }
        }
    }
}

 

ํ™•์‹คํžˆ ์‹œ๊ฐ„์ด ๊ฑฐ์˜ 2๋ฐฐ ๊ฐ€๊นŒ์ด ์ค„์–ด๋“  ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

'Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] 15664๋ฒˆ: N๊ณผ M(10)  (0) 2024.03.31
[Java] 2023๋ฒˆ: ์‹ ๊ธฐํ•œ ์†Œ์ˆ˜  (0) 2024.03.02
[Java] 19942๋ฒˆ: ๋‹ค์ด์–ดํŠธ  (0) 2024.02.01
[Java] 15686๋ฒˆ: ์น˜ํ‚จ ๋ฐฐ๋‹ฌ  (1) 2024.01.30