Problem Solving/백준

[BOJ 백준, 삼성 SW 역량 테스트 기출 문제] 14888번 : 연산자 끼워넣기 - Python

돌돌김 2021. 1. 4. 03:36

www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 

모든 경우의 수를 전부 확인해서 원하는 답을 구하는 전형적인 완전탐색 문제였다

 

숫자의 위치는 고정되어있고 모든 연산자를 사용해야 하므로 연산자의 순서만 정해주면된다. 

 

 

 

사용 할 수 있는 연산자의 순서를 정할 때는 순열을 사용한다. 

 

연산자가 최대 10개까지밖에 없으므로 파이썬 내장 라이브러리를 활용하여 풀었다.

 

주의할 점은 나누기 연산의 경우 음수로 나눠지는 경우가 있기 때문에

 

양수로 변환하여 나누기 연산을 한 뒤, 다시 음수화 하는 작업이 필요하다

 

 

소스코드

 

from itertools import permutations

n = int(input())
numbers = list(map(int, input().split()))
#  차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수
_sum, _sub, _mul, _div = map(int, input().split())
s = '+'*_sum + '-'*_sub + '*'*_mul + "/"*_div
operators = list(s)
answer = 0
permu_operators = list(permutations(operators, len(operators)))

max_value = -2e9
min_value = 2e9

for oper in permu_operators:
    result = numbers[0]
    idx = 1
    for item in oper:
        if item == '+':
            result += numbers[idx]
        elif item == '-':
            result -= numbers[idx]
        elif item == '*':
            result *= numbers[idx]
        elif item == '/':
            if result < 0 : # 음수일 경우
                result = -(result)
                result = result // numbers[idx]
                result = -(result)
            else:
                result = result // numbers[idx]
        idx += 1
    max_value = max(max_value, result)
    min_value = min(min_value, result)
    
print(max_value)
print(min_value)