Algorithm

[백준] 연산자 끼워넣기 14888번 (python)

salmon16 2021. 6. 10. 11:54

출처 : 14888번: 연산자 끼워넣기 (acmicpc.net)

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 

www.acmicpc.net

풀이 방법

DFS로 완전 탐색으로 풀어야 한다.

연산자를 배열로 따로 넣어 두고 각 연산자가 남아 있으면 사용하고 연산자 배열에서 -1을 해주고

dfs를 호출하고 다시 연산자 배열에서 +1을 해주는 백트레킹 방식으로 풀이 하였다.

max_num = -987654321
min_num = 987654321
def dfs(index, sum):
    global min_num, max_num,path
    if index == N:
        min_num = min(min_num, sum)
        max_num = max(max_num, sum)
    for i in range(4):
        if (arithmetic[i] > 0):
            if (i == 0):
                arithmetic[i] -= 1
                dfs(index+1, sum+num[index])
                arithmetic[i] += 1
            elif(i == 1):
                arithmetic[i] -= 1
                dfs(index + 1, sum-num[index])
                arithmetic[i] += 1
            elif (i == 2):
                arithmetic[i] -= 1
                dfs(index + 1, sum * num[index])
                arithmetic[i] += 1
            elif (i == 3):
                arithmetic[i] -= 1
                dfs(index + 1,  int(sum / num[index]))
                arithmetic[i] += 1

N = int(input())
num = []
arithmetic = []
num = list(map(int, input().split()))
arithmetic = list(map(int, input().split()))

dfs(1, num[0])
print(max_num)
print(min_num)