Development/자료구조 & 알고리즘
[알고리즘] 백준 14888 - 연산자 끼워넣기 (파이썬)
heondeam
2023. 4. 26. 11:08
오랜만에 내 힘으로 푼 문제.
처음에 순열 라이브러리를 사용해서 모든 경우의 수를 구해야 겠다고 생각하다가.. 시간 초과가 예상되어 DFS로 풀이했다.
아래는 풀이 코드이다.
from sys import stdin as s
def DFS(index, sum):
global A, operators
if index == len(A) - 1 :
ans.append(sum)
return
else:
# 재귀적으로 DFS 탐색 시작
# 덧셈, 뺄셈, 곱셈, 나눗셈 4가지 경우의 수. (operator 배열의 인덱스 순)
for i in range(4):
# 횟수가 남아있다면
if operators[i] > 0:
if i == 0:
operators[i] -= 1
DFS(index + 1, sum + (A[index + 1]))
operators[i] += 1
elif i == 1:
operators[i] -= 1
DFS(index + 1, sum - (A[index + 1]))
operators[i] += 1
elif i == 2:
operators[i] -= 1
DFS(index + 1, sum * (A[index + 1]))
operators[i] += 1
elif i == 3:
operators[i] -= 1
if sum < 0 :
DFS(index + 1, -(abs(sum) // (A[index + 1])))
operators[i] += 1
else:
DFS(index + 1, sum // (A[index + 1]))
operators[i] += 1
if __name__ == "__main__":
n = int(s.readline().rstrip())
A = list(map(int, s.readline().rstrip().split()))
operators = list(map(int, s.readline().rstrip().split()))
ans = []
DFS(0, A[0])
print(max(ans), min(ans), sep="\n")