프로그래머스 수식 최대화 (Java,자바)

jonghyukLee·2021년 9월 8일
0

이번에 풀어본 문제는
프로그래머스 수식 최대화 입니다.

📕 문제 링크

❗️코드

import java.util.*;
class Solution {
    static boolean [] isVis;
    static long maxVal = Integer.MIN_VALUE;
    static ArrayList<Long> numbers;
    static ArrayList<Character> opers;
    public long solution(String expression) {
        char [] opArr = {'+','-','*'};
        opers = new ArrayList<>();
        numbers = new ArrayList<>();
        StringBuilder sb = new StringBuilder(expression);
        
        for(int i = 0; i < sb.length(); ++i)
        {
            char c = sb.charAt(i);
            if(c == '+' || c == '-' || c == '*')
            {
                opers.add(c);
                sb.setCharAt(i,' ');
            }
        }
        String [] tmpNum = sb.toString().split(" ");
        for(String s : tmpNum) numbers.add(Long.parseLong(s));
        isVis = new boolean[3];
        perm(opArr,"");
        return maxVal;
    }
    static void perm(char [] arr, String curStr)
    {
        if(curStr.length() == 3)
        {
            calc(curStr);
            return;
        }
        for(int i = 0; i < 3; ++i)
        {
            if(isVis[i]) continue;
            isVis[i] = true;
            perm(arr,curStr+arr[i]);
            isVis[i] = false;
        }
    }
    static void calc(String str)
    {
        ArrayList<Long> tmpAl = new ArrayList<>(numbers);
        ArrayList<Character> tmpOP = new ArrayList<>(opers);
        for(int i = 0; i < str.length(); ++i)
        {
            char op = str.charAt(i);
            for(int j = 0; j < tmpOP.size(); ++j)
            {
                if(tmpOP.get(j) == op)
                {
                    if(op == '+') tmpAl.set(j,tmpAl.get(j)+tmpAl.get(j+1));
                    else if(op == '-') tmpAl.set(j,tmpAl.get(j)-tmpAl.get(j+1));
                    else tmpAl.set(j,tmpAl.get(j)*tmpAl.get(j+1));
                    tmpAl.remove(j+1);
                    tmpOP.remove(j);
                    j -= 1;
                }
            }
        }
        maxVal = Math.max(maxVal,Math.abs(tmpAl.get(0)));
    }
}

📝 풀이

경우의 수가 최대 6가지라서 완전탐색으로 풀었습니다.
먼저 연산자들을 탐색하여 ArrayList에 담아주고, 해당 연산자의 위치를 공백으로 바꿔둡니다. 연산자를 모두 담았다면 공백을 기준으로 문자열을 분리해주면, 연산자와 피연산자를 분리해줄 수 있습니다.
이후에는 순열 알고리즘을 통해 생성된 우선순위를 calc()로 전달하여 계산을 진행해줍니다. 각 경우마다 나온 결과값을 최대값으로 갱신해주고, maxVal을 출력해주면 완료됩니다.

📜 후기

문자열 분리를 깔끔하게 하고싶어서 고민하다보니 꽤 오래걸렸습니다.
결국 고민만 하고 구현을 못해서.. 조금 찝찝하지만 시간이 생명인 테스트인만큼 다음엔 욕심을 버려야겠어요ㅠ

profile
머무르지 않기!

0개의 댓글