[프로그래머스] 수식 최대화

2020. 7. 2. 20:33프로그래머스/카카오

import java.util.*;

class Solution {
    public long solution(String expression) {
        long answer = 0;
        
        List<Long> allAnswer = new ArrayList<>();
        
        String[][] allCase = {{"+","-","*"},{"+","*","-"},{"-","+","*"},{"-","*","+"},
                              {"*","+","-"},{"*","-","+"}};
        
        for(int i=0; i<allCase.length; i++){
            allAnswer.add(calculateAnswer(allCase[i],expression));
        }
        
        Collections.sort(allAnswer);
        
        answer = allAnswer.get(allAnswer.size()-1);
   
        return answer;
    }
    
    private Long calculateAnswer(String[] oneCase, String expression){
        List<String> changeExpression = new ArrayList<>();
        int flag =0;
        
        for(int i=0; i<expression.length(); i++){
            if(!Character.isDigit(expression.charAt(i))){
                changeExpression.add(expression.substring(flag,i));
                changeExpression.add(String.valueOf(expression.charAt(i)));
                flag=i+1;
            }
                
        }
        
        changeExpression.add(expression.substring(flag));
        
        
            for(int i=0; i<oneCase.length; i++){
                
                for(int j=0; j<changeExpression.size(); j++){
                    if(changeExpression.get(j).equals(oneCase[i])){
                        Long num1 = Long.parseLong(changeExpression.get(j-1));
                        Long num2 = Long.parseLong(changeExpression.get(j+1));
                        if(oneCase[i].equals("*")){
                         changeExpression.add(j-1,String.valueOf(num1*num2));   
                        }else if(oneCase[i].equals("-")){
                         changeExpression.add(j-1,String.valueOf(num1-num2));   
                        }else{
                         changeExpression.add(j-1,String.valueOf(num1+num2));   
                        }
                        for(int k=0; k<3; k++){
                        changeExpression.remove(j);
                        }
                            j--;
                    }
                }
            }
        
        
      return Math.abs(Long.parseLong(changeExpression.get(0)));
    }
  
}

1. 리스트의 인덱스 삭제,삽입에 대해 잘 생각해보게 된 문제이다.... 

2. 경우의수가 6가지 뿐이므로 각 경우의수를 배열로 만들어 우선순위를 정해주었다.

3. 완전 탐색문제이므로 dfs로 푸는 방법을 생각해 봐야겠다.