ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 14888 연산자 끼워넣기
    Algorithm/구현(Brute force, Back tracking, etc.) 2021. 11. 15. 17:31
    728x90

    - N개의 수열과 N-1개의 연산자가 주어질 때, 가능한 모든 연산 결과의 최소값과 최대값을 구하는 문제이다.

     

    - 브루트 포스 문제이고, N의 범위가 2 이상 11 이하인 것으로 보아, 재귀 백트래킹으로 풀 수 있는 문제임을 알 수 있다. (약 4^11 = 2^22)

     

    - 백트래킹을 평소 열심히 연습해왔다면 쉽게 풀 수 있는 문제이다. 종결 조건은 cnt 매개변수가 n과 같아질 때, 즉 모든 피연산자를 사용 했을 때 최대 / 최소값을 최신화하면 된다.

     

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n;
    int executed[11];
    int num_plus, num_minus, num_multiply, num_divide;
    int min_answer = 1000000000;
    int max_answer = -1000000000;
    
    void DFS(int cnt, int num_plus, int num_minus, int num_multiply, int num_divide, int total) {
    	if (cnt == n) {
    		min_answer = min(min_answer, total);
    		max_answer = max(max_answer, total);
    		return;
    	}
    	if (num_plus > 0) DFS(cnt + 1, num_plus-1, num_minus, num_multiply, num_divide,  total + executed[cnt]);
    	if (num_minus > 0) DFS(cnt + 1, num_plus, num_minus-1, num_multiply, num_divide, total - executed[cnt]);
    	if (num_multiply > 0) DFS(cnt + 1, num_plus, num_minus, num_multiply-1, num_divide, total * executed[cnt]);
    	if (num_divide > 0) DFS(cnt + 1, num_plus, num_minus, num_multiply, num_divide-1, total / executed[cnt]);
    
    }
    
    int main() {
    	cin >> n;
    	for (int i = 0; i < n; i++) {
    		cin >> executed[i];
    	}
    	cin >> num_plus >> num_minus >> num_multiply >> num_divide;
    	DFS(1, num_plus, num_minus, num_multiply, num_divide, executed[0]);
    	cout << max_answer << '\n';
    	cout << min_answer << '\n';
        return 0;
    }

    'Algorithm > 구현(Brute force, Back tracking, etc.)' 카테고리의 다른 글

    백준 14890 경사로  (0) 2021.11.16
    백준 14889 스타트와 링크  (0) 2021.11.15
    백준 14503 로봇 청소기  (0) 2021.11.15
    백준 14501 퇴사  (0) 2021.11.11
    백준 14500 테트로미노  (0) 2021.11.09

    댓글

Designed by Tistory.