백준 연산자 끼워넣기 코드 및 해설 (파이썬)

2021. 9. 8. 14:24algorithm

반응형

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 

입력으로 주어진 수와 연산자를 저장합니다. 주어진 연산자 조건에 따라 가능한 모든 중복없는 배열을 permutated_operators에 저장하고, 각 배열마다 계산한 값을 vals에 저장합니다. 음수로 나누기를 할 땐 문제에서 주어진 조건에 맞게 변형 후 계산합니다. 이렇게 구한 값들중 최댓값과 최솟값을 차례로 프린트합니다.

 

import sys
from itertools import permutations

# 수의 개수
N = int(sys.stdin.readline())
# 주어진 수들
nums = list(map(int, sys.stdin.readline().split()))
# 연산자
operator_list = list(map(int, sys.stdin.readline().split()))
operators = []
for i, op in enumerate(operator_list):
    if i == 0:
        operators += ['+'] * op
    elif i == 1:
        operators += ['-'] * op
    elif i == 2:
        operators += ['*'] * op
    else:
        operators += ['//'] * op

# permutations은 같은 기호 2개 이상 있을 때 둘을 다른 것으로 구분하므로, set을 통해 중복을 제거해줘야 함 
permuted_operators = list(set(permutations(operators)))

# 연산자 permutation에 따른 모든 값들의 리스트 
vals = []

for op in permuted_operators:
    val = nums[0]
    for num, o in zip(nums[1:], op):
        if o == '+':
            val += num
        elif o == '-':
            val -= num
        elif o == '*':
            val *= num
        else:
            if val < 0:
                val = (-1) * (((-1) * val) // num)
            else:
                val //= num
    vals.append(val)

print(max(vals)) # 최댓값
print(min(vals)) # 최솟값
반응형