programmers_[카카오 인턴] 수식 최대화_java

2023. 5. 2. 18:01Algorithm/Programmers

728x90

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

 

프로그래머스

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

programmers.co.kr

import java.util.*;
class Solution {
    private long max;
    
    public long solution(String expression) {
        long answer = 0;

        // 수식 분리
        String[] opers = expression.split("[0-9]+");
        String[] nums = expression.split("[^0-9]");

        List<Long> numList = new ArrayList<>();
        List<String> operList = new ArrayList<>();
        for(String o : nums){
            numList.add(Long.parseLong(o));
        }
        for (int i = 1; i< opers.length; i++){
            operList.add(opers[i]);
        }

        // 연산자 목록
        String[] operMenu = {"*", "+", "-"};

        Map<Integer, String>  operMap = new HashMap<>();
        setOperOrder(numList, operList, operMenu, operMap, 1, new boolean[operMenu.length]);

        answer = max;

        return answer;
    }

    public void setOperOrder(List<Long> nums,List<String> opers, String[] operList, Map<Integer, String> operMap, int cnt, boolean[] visited){
        int operListLength = operList.length;

        if(operListLength < cnt){
            max = Math.max(max, Math.abs(cal(cloneLongList(nums), cloneStringList(opers), operMap)));
            return;
        }

        for(int i = 0; i< operListLength; i++){
            if(!visited[i]){
                visited[i] = true;
                operMap.put(cnt, operList[i]);
                setOperOrder(nums, opers, operList, operMap, cnt+1, visited);
                visited[i] = false;
            }
        }
    }

    public long cal(List<Long> nums,List<String> opers, Map<Integer, String> operMap){
        long res = 0;
        int idx = 0;
        while (!opers.isEmpty()){
            if(opers.indexOf(operMap.get(1)) != -1){ // 1순위
                idx = opers.indexOf(operMap.get(1));
            } else if(opers.indexOf(operMap.get(2)) != -1){ // 2순위
                idx = opers.indexOf(operMap.get(2));
            } else if(opers.indexOf(operMap.get(3)) != -1){ // 3순위
                idx = opers.indexOf(operMap.get(3));
            }

            if (idx == -1) { // 모든 연산자 사용
                break;
            }

            long n1 = nums.remove(idx); // 연산자 앞 숫자
            long n2 = nums.remove(idx); // 연산자 뒤 숫자
            String oper = opers.remove(idx);

            res = calculator(n1, n2, oper);
            nums.add(idx, res);
        }

        return res;
    }

    public List<String> cloneStringList(List<String> original){
        List<String> list = new ArrayList<>(original.size());
        for (String s: original){
            list.add(s);
        }
        return list;
    }

    public static List<Long> cloneLongList(List<Long> original){
        List<Long> list = new ArrayList<>(original.size());
        for (Long s: original){
            list.add(s);
        }
        return list;
    }

    public long calculator(long n1, long n2, String oper){
        switch (oper){
            case "+":
                return n1 + n2;
            case "-":
                return n1 - n2;
            case "*":
                return n1 * n2;
        }
        return -1;
    }
}