본문 바로가기
  • Thank you for visiting.....
카테고리 없음

[JAVA/프로그래머스] 수식 최대화

by HyunSoooo 2024. 3. 13.
728x90

 

이 문제는 숫자와 세 가지 기본 연산자만을 포함하는 문자열 형태의 수식을 받습니다. 주어진 수식에서 연산자의 우선순위를 자유롭게 재정의하여 수행 결과로 가능한 가장 큰 숫자를 찾아야 합니다. 연산 결과가 음수인 경우, 그 절댓값을 최종 값으로 제출합니다.

 

1.연산자 우선순위 조합생성 : 가능한 모든 연산자 우선 순위 조합은 세가지 연산자가 있으므로 3!=6 가지 조합이 가능합니다.

2.수식계산 : 각 우선순위 조합에 따라 수식을 계산합니다. 연산자에 따라 수식을 분할하고, 지정된 우선순위에 따라 숫자를 계산합니다

 

구현 방법

1.수식 파싱 : 주어진 수식을 숫자와 연산자로 분리합니다.

2.우선순위 설정 및 계산 : 세 가지 연산자에 대한 모든 우선순위 조합을 설정하고, 각 조합에 따라 수식을 계산합니다.

 

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

class Solution {
    public long solution(String expression) {
        long answer = 0;
          String[] priority = {"*,+,-" , "*,-,+","-,*,+","-,+,*","+,-,*","+,*,-"};

         //문자열 List 형식으로 변환
        StringBuilder sb = new StringBuilder();
        List<String> li = new ArrayList<>();
        for(char c : expression.toCharArray()){
            if(c == '*' || c=='-' || c=='+'){
                li.add(sb.toString());
                li.add(String.valueOf(c));
                sb = new StringBuilder();
            }else{
                sb.append(c);
            }
        }
        li.add(sb.toString());

        for(int i=0; i< priority.length; i++){
            String[] operators = priority[i].split(",");
            List<String> liTemp = new ArrayList<>(li);
            for(int j=0; j< operators.length; j++){
                String operator  = operators[j]; //기호
                for(int k=0; k < liTemp.size(); k++){ //기호에 따른 계산
                    if(liTemp.get(k).equals(operator)){
                        Long temp  = cal(Long.parseLong(liTemp.get(k-1)) , Long.parseLong(liTemp.get(k+1)) , operator);
                        liTemp.remove(k-1);
                        liTemp.remove(k-1);
                        liTemp.remove(k-1);
                        liTemp.add(k-1 , String.valueOf(temp));
                        k=0;
                    }
                }
            }
            answer = Math.max( Math.abs(answer) , Math.abs(Long.parseLong(liTemp.get(0))) );
        }

           return answer;
    }

    private static long cal(long a , long b , String operator){

        switch (operator){
            case "*":
                return a*b;
            case "-":
                return a-b;
            case "+":
                return a+b;
        }
        return 0;
    }
}

 

효율적이지 못해 보이네요...

그리고 if(c == '*' || c=='-' || c=='+') 이 부분을 => if(Character.isDigit(c)) 로 하면 더 좋아보이네요.

728x90