minimimi

[백준] 14888 연산자 끼워넣기 본문

프로그래밍 공부/알고리즘

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

99mini 2021. 10. 2. 10:00
반응형

문제출처] https://www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net


풀이

같은 숫자를 포함하는 순열을 구해야 된다. 파이썬에서 그러한 함수를 지원하지 않기 때문에 일반 순열 함수를 이용하여 순열을 구한다음 set 자료형을 사용하여 중복을 제거해주었다.

주의할 점은 음수 나누기 양수를 할 때, 음수를 우선 양수로 변환한 다음 나눗셈을 한 뒤 다시 음수로 변화해줘야 된다는 점이다.


소스코드는 Python 3으로 작성되었습니다.

import sys
from itertools import permutations

input = sys.stdin.readline

max_result = -1_000_000_001
min_result = 1_000_000_001

n = int(input())
numbers = list(map(int, input().split()))
input_operators = list(map(int, input().split()))
# 0 1 2 3
# + - * /

# 오퍼레이터 순열로 만들기
list_operators = []
for i, operator in enumerate(input_operators):
    for _ in range(operator):
        list_operators.append(i)
length_list_operators = len(list_operators)

permutation_operators = set(permutations(list_operators, length_list_operators))

for operators in permutation_operators:
    tmp_sum = numbers[0]

    for number, operator in zip(numbers[1:], operators):
        if operator == 0:
            tmp_sum += number
        elif operator == 1:
            tmp_sum -= number
        elif operator == 2:
            tmp_sum *= number
        else:
            if tmp_sum < 0:
                tmp_sum *= -1
                tmp_sum //= number
                tmp_sum *= -1
            else:
                tmp_sum //= number
                
    max_result = max(max_result, tmp_sum)
    min_result = min(min_result, tmp_sum)

print(max_result, min_result, sep='\n')
반응형

'프로그래밍 공부 > 알고리즘' 카테고리의 다른 글

[백준] 9184 신나는 함수 실행  (0) 2021.10.04
[백준] 11725 트리의 부모 찾기  (0) 2021.10.03
[백준] 4949 균형잡힌 세상  (0) 2021.09.29
[백준] 1010 다리 놓기  (0) 2021.09.28
[백준] 3036 링  (0) 2021.09.27