[SWEA][D3][#11803] 완전검색_전기카트
작성:    
업데이트:
카테고리: SWEA D3
태그: ProblemSolving, SWEA D3, SWEA PS
출처
학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.
문제
골프장 관리를 위해 전기 카트로 사무실에서 출발해 각 관리구역을 돌고 다시 사무실로 돌아와야 한다.
사무실에서 출발해 각 구역을 한 번씩만 방문하고 사무실로 돌아올 때의 최소 배터리 사용량을 구하시오.
각 구역을 이동할 때의 배터리 사용량은 표로 제공되며, 1번은 사무실을, 2번부터 N번은 관리구역 번호이다.
두 구역 사이도 갈 때와 올 때의 경사나 통행로가 다를 수 있으므로 배터리 소비량은 다를 수 있다.
N이 3인 경우 가능한 경로는 1-2-3-1, 1-3-2-1이며 각각의 배터리 소비량은 다음과 같이 계산할 수 있다.
e[1][2]+e[2][3]+e[3][1] = 18+55+18 = 91
e[1][3]+e[3][2]+e[2][1] = 34+7+48 = 89
그림 생략
이 경우 최소 소비량은 89가 된다.
입력
첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 첫 줄에 N이 주어지고, 다음 줄부터 N개씩 N개의 줄에 걸쳐 100이하의 자연수가 주어진다. 3<=N<=10
출력
각 줄마다 “#T” (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
예제
입력
3
3
0 18 34
48 0 55
18 7 0
4
0 83 65 97
82 0 78 6
19 19 0 82
6 34 94 0
5
0 9 26 85 42
14 0 84 31 27
58 88 0 16 46
83 61 94 0 17
40 71 24 38 0
출력
#1 89
#2 96
#3 139
My Sol
def combi(i, ssum):
global stack
if i == N-1:
global minCost
ssum += mat[stack[-1]][0]
if minCost > ssum:
minCost = ssum
return
for k in range(1, N):
if visited[k]: continue
visited[k] = 1
stack.append(k)
combi(i+1, ssum+mat[stack[i]][stack[i+1]])
visited[k] = 0
stack.pop()
T = int(input())
for tc in range(1, T+1):
N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
visited = [0]*N
stack = [0]
minCost = 10000
combi(0, 0)
print(f'#{tc} {minCost}')
완전 탐색을 이용해 조합의 모든 경우의 수를 하나하나 고려하여 최적해를 구하였다.
결과
PASS
댓글남기기