본문 바로가기
Computer Science/Algorithm

[백준] 14888 - 연산자 끼워넣기 (Python)

by 수제햄버거 2021. 7. 11.
728x90
반응형

문제 출처:

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

문제 풀이 :

  • 앞서 본 스타크와 링크 문제와 흡사하다. 연산자가 나올 수 있는 모든 경우의 수를 우선 구한 뒤 구한 경우의 수에 대해서 모두 실행해서 최소 최대를 구한다.
  • 보통 좀 더 어려워지면 모든 경우의 수를 구하는 것이 안되거나, 모든 경우의 수는 구할 수 있더라도 모두 실행할 순 없다거나 와 같은 경우가 대부분인 이 문제에선 모두 구하고 실행시켜도 통과가 된다.
import sys
import itertools

def calculator(command,num1,num2):
    if(command=='+'):
        return num1+num2
    elif(command=='-'):
        return num1-num2
    elif(command=='*'):
        return num1*num2
    elif(command=='/'):
        if(num1<0):
            num1 = -1*num1
            return -(num1//num2)
        else:
            return num1//num2


n = int(sys.stdin.readline())
sequence = list(map(int,sys.stdin.readline().split()))
operator_num = list(map(int,sys.stdin.readline().split()))
operator_str =['+','-','*','/']
operator=[]
max_val = -9999999999
min_val =9999999999
#print(sequence)
for i in range(4):
    for j in range(operator_num[i]):
        operator.append(operator_str[i])
#print(operator)

operator_case = list(set(itertools.permutations(operator)))
#print(operator_case)
#print(len(operator_case))

temp = sequence[0]
for i in range(len(operator_case)):
    for j in range(n-1):
        temp = calculator(operator_case[i][j],temp,sequence[j+1])

    if(temp>max_val):
        max_val = temp
    if(temp<min_val):
        min_val = temp
    temp=sequence[0]

print(max_val)
print(min_val)
반응형