프로그래머스 - 수식 최대화(Level 2)

2024. 1. 15. 19:09코딩테스트 정리(자바)

728x90
import java.util.*;
class 수식_최대화 {
    public static String[][] ex={
            "*-+".split(""), //연산자 하나씩 담기
            "*+-".split(""),
            "-*+".split(""),
            "-+*".split(""),
            "+*-".split(""),
            "+-*".split("")
    };

    public long calculate(long lhs,long rhs,String op){
        return switch(op){
            case "+"->lhs+rhs;
            case "-"->lhs-rhs;
            case"*"->lhs*rhs;
            default->0;
        };
    }

    public long calculate(List<String> tokens, String[] ex){
        for(String op:ex){ //연산자 하나씩
            for(int i=0;i<tokens.size();i++){
                if(tokens.get(i).equals(op)) { //연산자 같은지 비교
                    long lhs=Long.parseLong(tokens.get(i-1));
                    long rhs=Long.parseLong(tokens.get(i+1));
                    //연산자 기준 +1,-1은 숫자이므로
                    long result=calculate(lhs,rhs,op);
                    tokens.remove(i-1); //arraylist는 앞 원소가 제거되면 뒤의 원소가 땡겨지므로 lhs,rhs,연산자 제거 가능
                    tokens.remove(i - 1);
                    tokens.remove(i - 1);
                    tokens.add(i - 1, String.valueOf(result)); //result값을 문자열로 변환후 담기
                    i -= 2; //원소 2개가 제거되었으므로 i값 2칸 앞으로 조정
                }
            }
        }
        return Long.parseLong(tokens.get(0)); //연산을 모두 마쳤을 땐 인덱스 0에 결과값만 남게 됨
    }


    public  long solution(String expression) {
        StringTokenizer st=new StringTokenizer(expression,"*+-",true);
        //연산자 기준으로 분리해서 토큰에 담기, ture: 연산자들도 담기

        List<String> tokens=new ArrayList<>();
        while(st.hasMoreTokens()){
            tokens.add(st.nextToken());
        }


        long max=0;

        for(String[] str:ex){
            long value=Math.abs(
                    calculate(new ArrayList<>(tokens),str)); //반환값 절댓값 씌우기
            if(value>max)
                max=value;
        }
        return max;
    }
}

 

1. StringTokenizer로 숫자와 연산자를 분리하면 되는데 잊고 있었음

StringTokenizer st=new StringTokenizer(expression,"*+-",true);
        //연산자 기준으로 분리해서 토큰에 담기, ture: 연산자들도 담기

 

2. 이렇게 생성할 수도 있음.

new ArrayList<>(tokens)

 

 

3. ArrayList는 삽입과 삭제가 동적으로 이뤄지므로 이런 게 가능하다

tokens.remove(i-1); //arraylist는 앞 원소가 제거되면 뒤의 원소가 땡겨지므로 lhs,rhs,연산자 제거 가능
tokens.remove(i - 1);
tokens.remove(i - 1);
tokens.add(i - 1, String.valueOf(result)); //result값을 문자열로 변환후 담기
i -= 2; //원소 2개가 제거되었으므로 i값 2칸 앞으로 조정

 

4. 향상된 switch문

return switch(op){
            case "+"->lhs+rhs;
            case "-"->lhs-rhs;
            case"*"->lhs*rhs;
            default->0;
        };
728x90