https://www.acmicpc.net/problem/14888
- 브루트포스 알고리즘
- 백트래킹
def solve(x, op, i):
global max_ans, min_ans
if i == N:
min_ans = min(min_ans, x)
max_ans = max(max_ans, x)
return
# +
if op[0] > 0:
op[0] -= 1
solve(x + A[i], op, i+1)
op[0] += 1
# -
if op[1] > 0:
op[1] -= 1
solve(x - A[i], op, i+1)
op[1] += 1
# *
if op[2] > 0:
op[2] -= 1
solve(x * A[i], op, i+1)
op[2] += 1
# /
if op[3] > 0:
op[3] -= 1
if x < 0:
result = -(-x // A[i])
solve(result, op, i+1)
else:
solve(x // A[i], op, i+1)
op[3] += 1
N = int(input())
A = list(map(int, input().split()))
# 0: +, 1:-, 2:*, 3:/
op = list(map(int, input().split()))
# 최대, 최소값 구하기
max_ans = -1000000000
min_ans = 1000000000
solve(A[0], op, 1)
print(max_ans)
print(min_ans)
(//)
연산자의 개수이다.음수를 양수로 나눌 때 주의한다! 문제에서 설명한대로
나눗셈은 정수 나눗셈으로 몫만 취하며,
음수를 양수로 나눌 때는 양수로 바꾼 뒤 몫을 취하고, 그 몫을 음수로 바꾼다.
i의 값이 N일 때, x가 저장하고 있는 값은 계산식의 결과이다. 그 결과를 이용해 최대, 최소값을 갱신한다.