본문 바로가기
카테고리 없음

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

by C0MPAS 2024. 1. 26.

1월 26일(금) - 6장 완전 탐색

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;


public class Solution {

    private static String[][] precedences={
            "+-*".split(""),
            "+*-".split(""),
            "-+*".split(""),
            "-*+".split(""),
            "*+-".split(""),
            "*-+".split(""),
    };

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

    private long calculate(List<String> tokens, String[] precedence){
        for(String op : precedence)
        {
            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));
                    long result = calculate(lhs, rhs, op);
                    tokens.remove(i-1);
                    tokens.remove(i-1);
                    tokens.remove(i-1);
                    tokens.add(i-1, String.valueOf(result));
                    i -= 2;
                }
            }
        }
        return Long.parseLong(tokens.get(0));
    }

    public long solution(String expression){
        StringTokenizer st = new StringTokenizer(expression, "+-*",true);
        List<String> tokens = new ArrayList<>();
        while (st.hasMoreTokens())
        {
            tokens.add(st.nextToken());
        }

        long max = 0;
        for(String[] precedence : precedences)
        {
            long value = Math.abs(
                    calculate(new ArrayList<>(tokens), precedence));
            if(value > max)
            {
                max = value;
            }
        }
        
        return max;
    }
}

댓글