Algorithm

SWEA 5209 최소 생산 비용 (python)

광보기 2021. 4. 21. 16:34
반응형

5209. [파이썬 S/W 문제해결 구현] 5일차 - 최소 생산 비용 D3

 

[파이썬 S/W 문제해결 구현] 5일차

2021.04.21 - [Algorithm] - SWEA 5208 전기버스2 (python)

2021.04.21 - [Algorithm] - SWEA 5209 최소 생산 비용 (python)

 

문제

A사는 여러 곳에 공장을 갖고 있다. 봄부터 새로 생산되는 N종의 제품을 N곳의 공장에서 한 곳당 한가지씩 생산하려고 한다.

각 제품의 공장별 생산비용이 주어질 때 전체 제품의 최소 생산 비용을 계산하는 프로그램을 만드시오.

예를 들어 3개의 제품을 생산하려는 경우 각 공장별 생산비용은 다음과 같이 주어진다..

  A B C 공장
1 73 21 21  
2 11 59 40  
3 24 31 83  
제품        

이때 1-C, 2-A, 3-B로 제품별 생산 공장을 정하면 생산 비용이 21+11+31=63으로 최소가 된다.

[입력]

첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50

다음 줄부터 테스트 케이스의 별로 첫 줄에 제품 수 N이 주어지고, 이후 제품당 한 줄 씩 N개의 줄에 걸쳐 공장별 생산비용 Vij가 주어진다. 3<=N<=15, 1<=Vij<=99

[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

풀이과정

  • 이전에 비슷한 문제를 풀었던 적이 있다. 그것보단 조금 쉬웠다. 링크참고
    • y,x 인덱스가 하나도 겹치지 않게 골고루 들어가라는 조건이었다.
    • 이를 위해 y를 idx 로 정하고
    • x는 반복문을 통해서 해결했다.

코드

T = int(input())

# 비용 계산 함수
# 인덱스와 합을 받을 예정
# idx 값은 y값이라고 생각하면 된다.
def cost(idx, total):
    global result
    # 시간초과와 계산 번거로움줄이기 위한 코드
    # 만약 값이 이미 구한 값 초과한다면 종료
    if total >= result:
        return
    # 만약 다 검사를 마쳤다면
    if idx == N:
        # total 값은 결과값 ( 위에서 이미 걸렀기 때문 )
        result = total
        return
    # N만큼 돌면서 x축검사
    for i in range(N):
        # 만약 x의 인덱스가 방문한 적이 없다면
        if not visited[i]:
            # 방문 후 다음 idx값 살펴보고 다시 돌아오는 과정
            visited[i] = 1
            cost(idx+1, total+arr[idx][i])
            visited[i] = 0


for tc in range(1, T+1):
    N = int(input())
    arr = [list(map(int, input().split())) for _ in range(N)]
    visited = [0 for _ in range(N)]
    result = 100 * N
    cost(0, 0)

    print("#{} {}".format(tc, result))

반응형