N개의 수로 이루어진 수열과 쓰일 연산자의 종류가 주어진다. 해당 연산자들의 조합을 활용하여 나올 수 있는 결과값의 최대값과 최소값을 구해라.
단, 음수의 나눗셈은 해당 수를 양수로 바꾼 뒤 몫을 구하고 다시 음수화 한다.
문제 그대로 풀이하면된다. 순열을 통해 경우의 수에 맞춰 접근하면 쉽게 나온다.
from itertools import permutations
N = int(input())
num_array = list(map(int, input().split()))
yeon = ['+', '-', '*', '/']
yeon_num = list(map(int, input().split()))
operator = ""
# string으로 들어가야하는 연산자 다넣기
for n, y in zip(yeon_num, yeon):
operator += y * n
# operator의 순열 구하기
# 최대, 최소 순으로 값 구하기
answer = [-1e10, 1e10]
for op in permutations(operator):
temp = num_array[0]
for i in range(N-1):
if op[i] == '+':
temp += num_array[i+1]
elif op[i] == '-':
temp -= num_array[i+1]
elif op[i] == '*':
temp *= num_array[i+1]
elif op[i] == '/':
if temp < 0 :
t = temp
t *= -1
t //= num_array[i+1]
temp = -1 * t
else :
temp //= num_array[i+1]
if temp > answer[0] :
# 최대값인 경우
answer[0] = temp
if temp < answer[1] :
# 최소값인 경우
answer[1] = temp
for x in answer:
print(x)
다른 풀이로는 DFS를 활용하기도 한다.
# DFS를 활용한 풀이
n = int(input())
# 연산을 수행하고자 하는 수 리스트
data = list(map(int, input().split()))
# 더하기, 빼기, 곱하기, 나누기 연산자 개수
add, sub, mul, div = map(int, input().split())
# 최솟값과 최댓값 초기화
min_value = 1e9
max_value = -1e9
# 깊이 우선 탐색(DFS) 매서드
def dfs(i, now):
global min_value, max_value, add, sub, mul, div
# 모든 연산자를 다 사용한 경우, 최솟값과 최댓값 업데이트
if i == n:
min_value = min(min_value, now)
max_value = max(max_value, now)
else :
# 각 연산자에 대하여 재귀적으로 수행
if add > 0:
add -= 1
dfs(i + 1, now + data[i])
add += 1
if sub > 0:
sub -= 1
dfs(i + 1, now - data[i])
sub += 1
if mul > 0:
mul -= 1
dfs(i + 1, now * data[i])
mul += 1
if div > 0:
div -= 1
dfs(i + 1, int(now / data[i])) # 나눌 때는 나머지를 제거
div += 1
# DFS 메서드 호출
dfs(1, data[0])
# 최댓값과 최솟값 차례대로 출력
print(max_value)
print(min_value)
해당 문제는 '이것이 코딩 테스트다 - 나동빈 저'를 공부하며 정리한 내용입니다.