728x90
- 문제
- 해설
-
import sys N = int(sys.stdin.readline()) matrix = [list(map(int, x.strip().split())) for x in sys.stdin.readlines()] base_idx = [x for x in range(N)] def next_permutation(list): last_asc_idx = 0 for i in range(len(list) - 1): if list[i] < list[i + 1]: last_asc_idx = i val_at_last_asc_idx = list[last_asc_idx] last_idx_larger_than_val_at_last_asc_idx = 0 for j in range(last_asc_idx + 1, len(list), 1): if val_at_last_asc_idx < list[j]: last_idx_larger_than_val_at_last_asc_idx = j if last_asc_idx == 0 and last_idx_larger_than_val_at_last_asc_idx == 0: return False else: list[last_asc_idx], list[last_idx_larger_than_val_at_last_asc_idx] = \ list[last_idx_larger_than_val_at_last_asc_idx], list[last_asc_idx] last_idx_larger_than_val_at_last_asc_idx = len(list) - 1 while (last_asc_idx + 1 < last_idx_larger_than_val_at_last_asc_idx): list[last_asc_idx + 1], list[last_idx_larger_than_val_at_last_asc_idx] = \ list[last_idx_larger_than_val_at_last_asc_idx], list[last_asc_idx + 1] last_asc_idx += 1; last_idx_larger_than_val_at_last_asc_idx -= 1 return True def factorial(k): if k == 0 or k == 1: return 1 else: res = k for i in range(1, k, 1): res *= i return res total_available_count = factorial(N - 1) res = [] for j in range(total_available_count): cost = 0 out_inner_loop = False # 마지막 도시에서 처음 도시로 가지 못하는 경우 발견 if matrix[base_idx[N - 1]][base_idx[0]] == 0: # 다음 이동 경로 체크 next_permutation(base_idx) continue else: cost += matrix[base_idx[N - 1]][base_idx[0]] for i in range(N - 1): # 이동이 불가능한 도시의 경우 if matrix[base_idx[i]][base_idx[i + 1]] == 0: out_inner_loop = True break else: cost += matrix[base_idx[i]][base_idx[i + 1]] if out_inner_loop: # 다음 이동 경로 체크 next_permutation(base_idx) continue # 가능한 경우가 처음 나왔을 때 if len(res) == 0: res.append(cost) # 가능한 경우를 이전과 비교 else: if cost < res[0]: res[0] = cost # 다음 이동 경로 체크 next_permutation(base_idx) print(res[0])
-
- 포인트
- BruteForce임을 알아채야한다.
- next permutation을 구현할 수 있어야한다.
728x90
'Algorithm-Problems > 백준' 카테고리의 다른 글
[백준][1707] 이분 그래프 (0) | 2022.02.09 |
---|---|
[백준][1697] 숨바꼭질 (0) | 2022.02.06 |
[백준][1476] 날짜 계산 (0) | 2022.02.06 |
[백준][1260] DFS와 BFS (0) | 2022.02.06 |
[백준][1182] 부분수열의 합 (0) | 2022.02.06 |