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

 

16637번: 괄호 추가하기

첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가

www.acmicpc.net

코드설명

DFS를 활용하여 연산자를 고려하여 완전탐색을 진행하는 문제입니다.

 

문제에서 헷갈리는점은,

(A + B) + C는 어떻게 계산하는가가 헷갈리는데,

A + B 는 괄호가 없는경우 항상 먼저 시작하기에, 해당 사항은 이후의 괄호 처리시 자동으로 계산되는 로직입니다.

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


public class Main {
	
	public static int N;
	public static ArrayList<Integer> num = new ArrayList<>();
	public static ArrayList<Character> operand = new ArrayList<>();
	public static int answer = Integer.MIN_VALUE;
	
    public static void main(String[] args) throws IOException{
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	
    	StringTokenizer st = new StringTokenizer(br.readLine());
    	N = Integer.parseInt(st.nextToken());
    	
    	String str = br.readLine();
    	for(int i=0;i<N;i++) {    		
    		if(i%2 == 0) { // 짝수라면 (문자 숫자를 숫자로 변환하기 위해 - '0' 처리)
    			num.add(str.charAt(i) - '0');
    		}else if(i%2 == 1) { // 홀수라면
    			operand.add(str.charAt(i));
    		}
    	}
    	simulate(num.get(0), 0);
    	System.out.println(answer);
    }
    
    //현재 인덱스, 합
    public static void simulate(int sum, int operandIdx) {
    	if(operandIdx >= operand.size()) {
    		answer = Math.max(answer, sum);
    		return ;
    	}
    	
    	//괄호 없는경우 A + B
    	int rs1 = calculate(operand.get(operandIdx), sum, num.get(operandIdx + 1));
    	simulate(rs1, operandIdx + 1);
    	
    	//괄호 있는경우 ( 옆의 연산결과에 괄호를 붙이는것 )  A + (B + C)
    	if(operandIdx + 1 < operand.size()) {
    		int rs2 = calculate(operand.get(operandIdx + 1), num.get(operandIdx + 1), num.get(operandIdx + 2));
    		
    		int rs3 = calculate(operand.get(operandIdx), sum, rs2);
    		simulate(rs3, operandIdx + 2);
    	}
    }
    
    public static int calculate(char operand, int a, int b) {
    	switch(operand) {
    	case '+':
    		return a + b;
    	case '-':
    		return a - b;
    	case '*':
    		return a * b;
    	}
    	return 999;
    }
   
    
    
}

+ Recent posts