혼자 정리

14888번: 연산자 끼워넣기 본문

알고리즘 문풀/백준

14888번: 연산자 끼워넣기

tbonelee 2021. 8. 5. 14:05

문제링크

C++

#include <iostream>

using namespace std;

int N;

int A[11];
int oper[4];

int min_ret = 1000000000;
int max_ret = -1000000000;

void fun(int idx, int ret, int add, int sub, int mult, int div){
    if (idx == N){
        if (ret < min_ret)
            min_ret = ret;
        if (ret > max_ret)
            max_ret = ret;
        return ;
    }
    if (add > 0)
        fun(idx + 1, ret + A[idx], add - 1, sub, mult, div);
    if (sub > 0)
        fun(idx + 1, ret - A[idx], add, sub - 1, mult, div);
    if (mult > 0)
        fun(idx + 1, ret * A[idx], add, sub, mult - 1, div);
    if (div > 0 && A[idx] != 0){
        fun(idx + 1, ret / A[idx], add, sub, mult, div - 1);
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    for (int i = 0; i < N; i++){
        cin >> A[i];
    }
    for (int i = 0; i < 4; i++){
        cin >> oper[i];
    }
    fun(1, A[0], oper[0], oper[1], oper[2], oper[3]);
    cout << max_ret << "\n" << min_ret << "\n";
}

Python

import sys
input = sys.stdin.readline

N = int(input())
A = list(map(int, input().split()))
num_oper = list(map(int, input().split()))

A_len = len(A)

min_ret = 10000000000
max_ret = -10000000000

def fun(idx, ret, num_add, num_sub, num_mult, num_div):
    global A, A_len, min_ret, max_ret
    if idx == A_len:
        if ret < min_ret:
            min_ret = ret
        if ret > max_ret:
            max_ret = ret
        return
    if num_add > 0:
        fun(idx + 1, ret + A[idx], num_add - 1, num_sub, num_mult, num_div)
    if num_sub > 0:
        fun(idx + 1, ret - A[idx], num_add, num_sub - 1, num_mult, num_div)
    if num_mult > 0:
        fun(idx + 1, ret * A[idx], num_add, num_sub, num_mult - 1, num_div)
    if num_div > 0 and A[idx] != 0:
        if ret >= 0:
            fun(idx + 1, ret // A[idx], num_add, num_sub, num_mult, num_div - 1)
        else:
            fun(idx + 1, -((-ret) // A[idx]), num_add, num_sub, num_mult, num_div - 1)

fun(1, A[0], num_oper[0], num_oper[1], num_oper[2], num_oper[3])

print(max_ret)
print(min_ret)
  • 재귀 + 브루트포스
  • $O(4^N)$
  • 음수에서 파이썬에서 버림 나눗셈은 cpp의 나눗셈과 결과가 다를 수 있음에 주의(나머지가 없는 경우는 동일하므로 무조건 1 더하면 안 됨. 그렇게 했다가 계속 틀림)

'알고리즘 문풀 > 백준' 카테고리의 다른 글

3190번: 뱀  (0) 2021.08.05
14889번: 스타트와 링크  (0) 2021.08.05
14502번: 연구소  (0) 2021.08.05
14500: 테트로미노  (0) 2021.08.04
13458: 시험 감독  (0) 2021.08.04