

e.g., A = [1, 2, 3, 4]이며, 1개, 1개, 1개가 주어졌을 때

N = int(input())
arr = list(map(int, input().split()))
pl, mi, mu, di = map(int, input().split())
max_value = -float('inf') # 음의 무한
min_value = float('inf') # 양의 무한
result = 0
def calculate(i, result, pl, mi, mu, di):
# 전역 변수에 값을 새로 대입하려면 필요
global max_value, min_value
# 모든 연산이 완료됐을 때 값 갱신
if i == N:
min_value = min(min_value, result)
max_value = max(max_value, result)
# 연산자가 남아 있을 때만 재귀 호출
if pl > 0:
calculate(i + 1, result + arr[i], pl - 1, mi, mu, di)
if mi > 0:
calculate(i + 1, result - arr[i], pl, mi - 1, mu, di)
if mu > 0:
calculate(i + 1, result * arr[i], pl, mi, mu - 1, di)
if di > 0:
if result < 0:
# 음수를 양수로 나누는 게 특이한데, 문제에 잘 설명되어 있음
next = -((-result) // arr[i])
else:
next = result // arr[i]
calculate(i + 1, next, pl, mi, mu, di - 1)
calculate(1, arr[0], pl, mi, mu, di)
print(max_value)
print(min_value)
최대값, 최소값 집계
max_value, min_value 변수로 지정합니다.global 선언을 통해, 값을 수정할 수 있게 합니다.global 없이 가능하지만, 다른 값을 새로 대입하려면 global을 사용해야 합니다.재귀함수 정의
result에 숫자들이 담긴 값 arr의 i번째 값을 연산하는 calculate 함수를 정의합니다.result는 arr[0], i는 1로 둡니다.pl, mi, mu, di로 각각 남은 덧셈, 뺄셈, 곱셈, 나눗셈 연산자 수를 보냅니다.result 매개변수 자리에 연산 결과를 대입하는 식으로 구현합니다.-((-A) // B)와 같이 음수 값 A를 부호반전하고, B로 나눈 뒤 다시 부호반전하면 됩니다.분기 설정
i+1번째 숫자에 대해 calculate를 재귀 호출합니다.result 매개변수로 보내고, 해당 연산에 해당하는 매개변수를 1 감소시켜 calculate를 호출하면 됩니다.종료조건
i == N (모든 숫자를 다 계산한 경우)이 되면 재귀 호출을 종료합니다.result 매개변수의 값을 global 설정을 해 둔 max_value, min_value와 비교하여 갱신합니다.
