🖥️ CS/Baekjoon Algorithms

#14888번 연산자 끼워넣기 (c++)

한국의 메타몽 2020. 4. 20. 14:39

문제 링크 : www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 

전형적인 백 트래킹 문제.

bool문으로 방문 여부를 확인하지 않고 오로지 if문을 통해 풀 수 있던 점이 편해서 좋았다.

 

#include <iostream>
#include <climits>
using namespace std;

int n=0, mini = INT_MAX, maxi = INT_MIN, arr[12] = {0,}, pl=0, mi=0, mul=0, di=0;

void dfs(int sum, int pl, int mi, int mul, int di, int index){
    if(pl==0&&mi==0&&mul==0&&di==0){
        if(sum<mini) mini = sum;
        if(maxi<sum) maxi = sum;
        return;
    }
    if(pl!=0) dfs(sum+arr[index],pl-1,mi,mul,di,index+1);
    if(mi!=0) dfs(sum-arr[index],pl,mi-1,mul,di,index+1);
    if(mul!=0) dfs(sum*arr[index],pl,mi,mul-1,di,index+1);
    if(di!=0) dfs(sum/arr[index], pl,mi,mul,di-1,index+1);   
}

int main(void) {
    cin >> n;
    for(int i=1; i<=n; i++) cin >> arr[i];
    cin >> pl >> mi >> mul >> di;
    if(pl!=0) dfs(arr[1]+arr[2],pl-1,mi,mul,di,3);
    if(mi!=0) dfs(arr[1]-arr[2],pl,mi-1,mul,di,3);
    if(mul!=0) dfs(arr[1]*arr[2],pl,mi,mul-1,di,3);
    if(di!=0) dfs(arr[1]/arr[2], pl,mi,mul,di-1,3);
    cout << maxi << "\n" << mini << "\n"; 
   return 0;
}

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#1003번 피보나치 함수 (C++)  (0) 2020.04.22
#14889번 스타트와 링크 (c++)  (0) 2020.04.21
#2580번 스도쿠 (c++)  (0) 2020.04.20
#9663번 N-Queen (C++)  (0) 2020.03.22
#15650번 N과M(2) (c++)  (0) 2020.03.16