[BOJ] 14888 연산자 끼워넣기 C++ 문제풀이 & 소스코드

    반응형

    INFO

    난이도 : SILVER1

    유형 : 백트래킹, 브루트포스 

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

    소스코드 : https://github.com/novvvv/PS/blob/main/BOJ/2025/C%2B%2B/14888.cpp

     

    PS/BOJ/2025/C++/14888.cpp at main · novvvv/PS

    알고리즘 문제 풀이 코드 모음. Contribute to novvvv/PS development by creating an account on GitHub.

    github.com


    Solve

    문제분석

    N개의 수와 N-1개의 연산자가 주어졌을 때, 만들 수 있는 식의 결과가 최대인 것과 최소인 것을 구하는 프로그램을 작성. 

    예시로 6개의 수와 5개의 연산자 (+ 2개, - 1개, x 1개, / 1개) 가 주어졌다고 가정 시 같은 연산자는 구분할 필요가 없기에 5C2 * 3C1 * 2C1 * 1C1 = 60가지의 식이 생성된다. 

     

    변수 정의

    operands[11] : 수를 저장할 배열

    operators[4] : 연산자의 수를 저장할 배열 (+, -, * , %)

    int n;
    int operands[11];
    int operators[4]; // +, - , * , %
    int min_num = 1000000001;
    int max_num = -1000000001;

     

    입력

    int main() {
    
    	// ...
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> operands[i];
        }
        for (int i = 0; i < 4; i++) {
            cin >> operators[i];
        }
        
        back_track(operands[0], 1);
        // ...
    
        return 0;
    }

     

    메인 로직

    연산자 배열 operators[i]을 브루트포스 방식으로 순회하며, res 변수에 현재 값을 더해간다. 여기서 Idx는 operands 수의 인덱스를 의미한다. 

    최대 깊이에 도달해 연산자를 모두 사용했다면 연산자의 수를 복구시키는 백트래킹 알고리즘을 사용한다.

    void back_track(int res, int idx) {
    
        // base condition : 식 완성
        if (idx == n) {
            if (res > max_num) max_num = res;
            if (res < min_num) min_num = res;
            return;
        }
        
        for (int i = 0; i < 4; i++) {
            if (operators[i] > 0) {
                operators[i]--; // 연산자 사용
                if (i == 0) back_track(res + operands[idx], idx + 1); // +
                else if (i == 1) back_track(res - operands[idx], idx + 1); // -
                else if (i == 2) back_track(res * operands[idx], idx + 1); // *
                else back_track(res / operands[idx], idx + 1); // %
                operators[i]++; // 원복
            }
        }
    }

     

    핵심 수를 기준으로 백트래킹을 하는것이 아닌 연산자를 기준으로 백트래킹을 진행해야 한다.

    반응형

    댓글

    Designed by JB FACTORY