songining
article thumbnail

๋‚˜๋Š” ๋ธŒ๋ฃจํŠธํฌ์Šค ๋ฐฉ์‹์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค. ๊ทธ๊ฑฐ๋ฐ–์— ์ƒ๊ฐ์ด ๋‚˜์ง€ ์•Š์•˜๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•ด๋ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ดˆ๋ณด์ธ ๋‚˜์—๊ฒŒ๋Š” ๋„ˆ๋ฌด ์–ด๋ ค์› ๋‹ค.

 

๋ชจ๋“  ์ˆœ์—ด์„ ํƒ์ƒ‰ํ•ด์•ผํ•˜๋Š”๋ฐ ์ด ๋ฐฉ๋ฒ•์€ ์ฐพ์•„๋ณด์•˜๋‹ค. w[i][j]๊ฐ€ ๋„์‹œ i์—์„œ j๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด๋ผ๊ณ  ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— w[i][i+1]๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฑฐ๋ฆฌ๋น„์šฉ์„ ์„ธ์•ผ์ง€ ๋ชจ๋“  ๋„์‹œ๋ฅผ ๊ฒฝ์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

permutation์„ ์ด์šฉํ•˜์—ฌ 0๋ถ€ํ„ฐ n-1๊นŒ์ง€์˜ ์ˆ˜๋ฅผ ์ˆœ์—ด๋กœ ์งœ๊ณ  ๊ทธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋งˆ๋‹ค์˜ ๋น„์šฉ์„ ๊ตฌํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋„์‹œ๋ฅผ 0,1,2,3์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ perm = [3 1 2 0]์ด๋ผ๋ฉด  3->1 1->2 1->0์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ํƒ์ƒ‰ํ•ด๋ณธ ํ›„ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. 

 

import itertools

n = int(input())
distance_cost = []

min_distance = float('inf');
for i in range(n):
    input_list = list(map(int, input().split()))
    distance_cost.append(input_list)
print(distance_cost)

points = [i for i in range(n)]


def sum_distance(perm):
    distance = 0

    for j in range(0, n - 1):  # for๋ฌธ์„ ๋„๋Š” ๋™์•ˆ ์„ธ ๋„์‹œ๋ฅผ ๋ˆ๋‹ค.
        if distance_cost[perm[j]][perm[j + 1]] != 0:  # ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋„์‹œ๋งŒ
            distance += distance_cost[perm[j]][perm[j + 1]]
        else:
            return -1
    if distance_cost[perm[-1]][perm[0]] != 0:  # ์‹œ์ž‘์ ์œผ๋กœ ๋Œ์•„์˜ค๋Š” ๋น„์šฉ
        distance += distance_cost[perm[-1]][perm[0]]
    else:
        return -1

    return distance


for i in itertools.permutations(points):  # ์ˆœ์—ด๋งˆ๋‹ค ๋ˆ๋‹ค
    perm = list(i)
    result = sum_distance(perm)
    if result != -1:
        min_distance = min(min_distance, result)
print(min_distance)