[백준] 14888번 연산자 끼워넣기 리뉴얼 버전

반응형
반응형

문제는여기에 있습니다.

 

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

문제 N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 N-1개의 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있다. 우

b-programmer.tistory.com

 

전에는 메소드에 변수를 담아 사용했지만...

이번에는 다른 방법을 사용해봤다.

하지만 이 방법은 전에 사용했던 방법과 크게 차이는 없지만, 하나가 차이가 있다,

바로 메소드에 변수를 할당하지 않고 문제를 풀어보았다.

package _13.dfs.bfs;

import java.util.Scanner;

public class Operator3 {
    static int[] op = new int[4];
    static int[] maps;
    static int n;

    static int max = (int)(1e9 * -1);
    static int min = (int)1e9;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        maps = new int[n];

        for (int i = 0; i < n; i++) {
            maps[i] = sc.nextInt();
        }
        for (int i = 0; i < 4; i++) {
            op[i] = sc.nextInt();
        }
        solution(1, maps[0]);
        System.out.println(max);
        System.out.println(min);
    }

    private static void solution(int index, int sum) {
        if (index == n) {
            max = Math.max(max,sum);
            min = Math.min(min,sum);
            return;
        }

        for (int i = 0; i < 4; i++) {
            if (op[i] > 0) {
                op[i]--;
                operate(index, sum, i);
                op[i]++;
            }
        }
    }

    private static void operate(int index, int sum, int i) {
        switch (i) {
            case 0:
                solution(index + 1, sum + maps[index]);
                break;
            case 1:
                solution(index + 1, sum - maps[index]);
                break;

            case 2:
                solution(index + 1, sum * maps[index]);
                break;

            case 3:
                solution(index + 1, sum / maps[index]);
                break;
        }
    }
}

 

특이한건 op[i]-- 뒤에 op[i]++이 있다.

이게 있는 이유는 현재 재귀를 통해 값을 계산하고 있다.

op값이 감소 가 되었으니 재귀문 밖으로 나오면 op값이 감소가 된 상태로 들어가게 된다.

 

예를들어,

나는 1 1 1 1 이런식으로 값을 넣었다고 가정해보자.

처음에는 덧셈이 들어가기 때문에 덧셈이 계산이 될테고..

뺄셈이 순차적으로 계산이 된다.

하지만, 뺄셈부터 할 수도 있다,

이를 방지하기 위해 op[i]를 이용해서 다시 원상 복구를 시켜주는것이 바로 그 이유다.

 

만약, 이것을 하지 않을 경우,

덧셈 -> 뺄셈 -> 곱셈 -> 나눗셈 순서로 고정이 될것이고,

곱셈부터 계산하고 싶어도 불가능해지게 된다.

 

그러면 자연스럽게 모든 계산식을 구할 수 있다.

 

사실 밑에 operate 메소드는 수정하고 싶다. 현재 어떻게 하면 합칠 수 있을까

고민중에 있다.

 

 

반응형

댓글

Designed by JB FACTORY