[알고리즘] 프로그래머스 수식최대화 level2

Jifrozen·2022년 11월 26일
0

Algorithm

목록 보기
66/70

문제

https://school.programmers.co.kr/learn/courses/30/lessons/67257

+-* 연산이 있고 가장 큰 값이 나오도록 연산 우선순위를 정하는 문제이다.

100-200300-500+20가 있다면
-+ 순으로 하여 100-(200*300)-500+20 = |-60420|
이 가장 큰 값이다.

빡 구현문제인데 우선 연산자가 3개(-*+)이기 때문에 경우의 수는 3! = 6개이다.
그러므로 그냥 char[][] op를 만들어 6개의 경우를 넣어주었다.

  1. 계산을 쉽게 하기 위해 expression을 연산자와 피연산자의 배열을 만든다..
  2. 연산자 우선순위==연산자 list.get()값이 같으면 계산을 수행한다.
    2-1 number(피연산자 배열) opList(연산자 배열)을 보면
    연산자 index에서 index와 index+1의 피연산자를 사용하는걸 확인할 수 있다.

    2-2 연산한 결과를 add(index,value)를 통해 해당 index에 값을 집어넣은뒤 index+1의 값을 차례로 지운다(200,300)
    연산자 배열또한 연산은 완료했기 때문에 index를 통해 배열에서 값을 지운다.
  3. 해당 경우를 다 돌았으면 max값을 통해 가장 큰 값을 찾는다.

코드

import java.util.*;
class Solution {
    static char[][] op={{'*','-','+'},{'*','+','-'},{'+','*','-'},{'+','-','*'},{'-','+','*'},{'-','*','+'}};
    static long max=0;
    public long solution(String expression) {
        for(int i=0;i<6;i++){
            calc(i,expression);
        }
        return max;
    }
    
    public void calc(int calcIndex,String expression){
    //1번
        StringBuilder num=new StringBuilder();
        ArrayList<Long> number=new ArrayList<>();
        ArrayList<Character> opList=new ArrayList<>();
            for(char c:expression.toCharArray()){
                if(c=='-'||c=='+'||c=='*'){
                    opList.add(c);
                    number.add(Long.parseLong(num.toString()));
                    num=new StringBuilder();
                }else{
                    num.append(c);
                }
            }
            number.add(Long.parseLong(num.toString()));
        //2번
        for(int i=0;i<3;i++){
            char operator=op[calcIndex][i];
            while(opList.size()!=0){
            //2-1
                int index=opList.indexOf(operator);
                if(index==-1) break;
                else{
                    switch(operator){
                        case '*':
                            number.add(index,number.get(index)*number.get(index+1));
                            break;
                        case '+':
                            number.add(index,number.get(index)+number.get(index+1));
                            break;
                        case '-':
                            number.add(index,number.get(index)-number.get(index+1));
                            break;
                    }
                    //2-2
                    number.remove(index+1);number.remove(index+1);
                    opList.remove(index);
                }
            }
        }
        //3
        max=Math.max(max,Math.abs(number.get(0)));
        
    }
}

0개의 댓글