Algorithm/SW Expert Academy

[Python] 4012. 요리사

느낌표 공장장 2021. 10. 12. 23:59

1. 조합을 직접 구현하여 해결한 풀이

# 조합 구하기
def combination(idx, cnt, a_arr):
    if cnt == n//2: # 식재료 다 골랐다면
        cal_diff(a_arr) # 두 음식의 맛 차이 구하러 고고
        return

    for i in range(idx, n):
        combination(i+1, cnt+1, a_arr+[i])  # 다음 번호 구해 [0, 1, 2] -> [0, 1, 3] -> [0, 1, 4]


# a, b 음식 맛 차이 구하기
def cal_diff(a_arr):
    global answer

    a, b = 0, 0
    b_arr = [i for i in range(n) if i not in a_arr] # a 음식에서 선택하지 않은 식재료 선택
    for i in range(n//2-1):
        for j in range(i+1, n//2):
            a += synergy[a_arr[i]][a_arr[j]] + synergy[a_arr[j]][a_arr[i]]  # a 음식의 맛 더하기
            b += synergy[b_arr[i]][b_arr[j]] + synergy[b_arr[j]][b_arr[i]]  # b 음식의 맛 더하기

    answer = min(answer, abs(a-b))  # 최소값으로 갱신


tc = int(input())
for idx in range(1, tc+1):
    n = int(input())    # 식재료 개수
    synergy = [list(map(int, input().split())) for _ in range(n)]   # 음식들의 시너지

    answer = 9999999999
    combination(0, 0, [])
    print('#{} {}'.format(idx, answer))

 

2. itertools의 combinations 사용한 풀이 

from itertools import combinations


tc = int(input())
for idx in range(1, tc+1):
    n = int(input())    # 식재료 개수
    synergy = [list(map(int, input().split())) for _ in range(n)]   # 음식들의 시너지

    answer = 9999999999
    for a_arr in combinations(range(n), n//2):  # a 음식 고를 식재료 선택
        b_arr = [i for i in range(n) if i not in a_arr]  # a 음식에서 선택하지 않은 식재료 선택
        a, b = 0, 0
        for i in range(n // 2 - 1):
            for j in range(i + 1, n // 2):
                a += synergy[a_arr[i]][a_arr[j]] + synergy[a_arr[j]][a_arr[i]]  # a 음식의 맛 더하기
                b += synergy[b_arr[i]][b_arr[j]] + synergy[b_arr[j]][b_arr[i]]  # b 음식의 맛 더하기

        answer = min(answer, abs(a - b))  # 최소값으로 갱신

    print('#{} {}'.format(idx, answer))

 

3. itertools의 combinations, permutations 사용한 풀이 

from itertools import permutations, combinations


tc = int(input())
for idx in range(1, tc+1):
    n = int(input())    # 식재료 개수
    synergy = [list(map(int, input().split())) for _ in range(n)]   # 음식들의 시너지

    answer = 9999999999
    for a_arr in combinations(range(n), n//2):  # a 음식 고를 식재료 선택
        b_arr = [i for i in range(n) if i not in a_arr]  # a 음식에서 선택하지 않은 식재료 선택
        a, b = 0, 0
        for i, j in permutations(a_arr, 2):
            a += synergy[i][j]   # a 음식의 맛 더하기

        for i, j in permutations(b_arr, 2):
            b += synergy[i][j]   # b 음식의 맛 더하기

        answer = min(answer, abs(a - b))  # 최소값으로 갱신

    print('#{} {}'.format(idx, answer))

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 1952. 수영장  (0) 2021.10.12
[Python] 2105. 디저트 카페  (0) 2021.10.12
[Python] 1486. 장훈이의 높은 선반  (0) 2021.10.09
[Python] 쉬운 거스름돈  (0) 2021.10.08
[Python] 1861. 정사각형 방  (0) 2021.10.08