본문 바로가기

CodingTest

[Python][백준 14888번] 연산자 끼워넣기

# https://www.acmicpc.net/problem/14888

import collections
from collections import deque, Counter
import sys
import heapq
sys.stdin = open("input.txt", "rt")
sys.setrecursionlimit(100000)

'''
먼저 모든 수열을 입력받고,

순열을 만들어 저장할 배열을 설정한다
+ 0, - 1, * 2, // 3 으로 설정한다.

각 순열 조합에 대한, 결과들을
배열에 모두 저장해서

그 중에서 최대, 최소를 선택하면 된다

즉, 특정 순열에 대한, 결과값이 각각 다르게 나올 것이라는 것이다. 

'''


def next_permutation(a):
    i = len(a) - 1
    # 여기서는 next_permutaion할 때 등호 비교를 꼭 포함시켜줘야 한다
    # 왜냐하면, 실제로 a에 중복된 값이 존재하기 때문이다
    while i > 0 and a[i-1] >= a[i]:
        i -= 1

    if i <= 0:
        return False

    j = len(a) - 1

    while a[j] <= a[i-1]:
        j -= 1

    a[i-1], a[j] = a[j], a[i-1]

    j = len(a) - 1

    while i < j:
        a[i], a[j] = a[j], a[i]
        i += 1
        j -= 1
    return True


def div(a, b):
    if a >= 0:
        return a // b
    else:
        return -(- a // b)


def cal(arr, d):
    now = arr[0]
    for i in range(len(d)):
        if d[i] == 0:
            now += arr[i+1]
        elif d[i] == 1:
            now -= arr[i+1]
        elif d[i] == 2:
            now *= arr[i+1]
        else:
            now = div(now, arr[i+1])
    return now


n = int(input())
inputArr = list(map(int, input().split()))
calc = list(map(int, input().split()))
d = []
res = []
for i in range(len(calc)):
    for _ in range(calc[i]):
        d.append(i)

while True:
    now = cal(inputArr, d)
    res.append(now)
    if not next_permutation(d):
        break

print(max(res))
print(min(res))