chldkato

백준 14888 연산자 끼워넣기 (파이썬) 본문

백준

백준 14888 연산자 끼워넣기 (파이썬)

chldkato 2020. 4. 17. 01:11

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

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다. 

www.acmicpc.net

1. 리스트 a에 입력받은 숫자를 저장하고 리스트 func에 연산자의 개수를 저장한다

2. dfs 순열로 끼워넣을 연산자를 q에 저장한다

3. select는 선택한 연산자의 개수를 저장한다. 해당 인덱스에서 select와 func가 같으면 다음 연산자로 넘어간다

4. 순열을 만들었으면 res에 연산한 결과를 저장한다

5. max_ans와 min_ans에 결과의 최대값과 최소값을 저장한다

from collections import deque
import sys

input = sys.stdin.readline

def dfs(cnt):
    global max_ans, min_ans
    if cnt == n-1:
        res = a[0]
        for i in range(n-1):
            if q[i] == 0:
                res += a[i+1]
            elif q[i] == 1:
                res -= a[i+1]
            elif q[i] == 2:
                res *= a[i+1]
            else:
                res = int(res / a[i+1])
        max_ans = max(max_ans, res)
        min_ans = min(min_ans, res)

    for i in range(4):
        if select[i] == func[i]:
            continue
        select[i] += 1
        q.append(i)
        dfs(cnt+1)
        select[i] -= 1
        q.pop()


n = int(input())
a = list(map(int, input().split()))
func = list(map(int, input().split()))

select, q = [0 for _ in range(4)], deque()
max_ans, min_ans = -sys.maxsize, sys.maxsize
dfs(0)
print(max_ans)
print(min_ans)

Comments