개발(0)/CodingTest

[프로그래머스/Level2]수식최대화 - 자바

까만밀가루 2024. 5. 6. 20:26

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

 

프로그래머스

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

programmers.co.kr

 


[문제 고려 조건]

  1. 조합의 수가 적기 때문에 수열이 아닌 직접 조합을 이용  →  수식 조합
  2. 주어진 expression 문자열 →  문자 list에 담기
  3. 수식 조합의 for문을 돌면서 list 돌기 : 수식의 우선 순위로 계산
    이 때, 절대값과 큰 값을 비교한다.
  4. 추가 method : 수식은 문자열이기 때문에 각각의 수식에 대한 계산 정의 

 


[문제 풀이]

1.전체 가능한 수에 대한 수식을 조합한다.

        String op[][] = {{"+", "-", "*"}, {"+", "*", "-"}, {"-", "+", "*"},
                {"-", "*", "+"}, {"*", "-", "+"}, {"*", "+", "-"}};

 

 

 

2.주어진 expression에 대해 list로 담는다. 이때 마지막 숫자로 담을 수 있게 마지막 list.add 잊지 말자(나의 실패 이유1)

이때 수식을 기준으로 담는 이유는 "100-200"일때 1,0,0,-,2,0,0 이런식으로 되기 때문에 

즉, 코드 자체로는 이게 숫자인지 수식인지 구분을 못하기 때문

 ArrayList<String> list = new ArrayList<String>();

 int start = 0;
 for (int i = 0; i < expression.length(); i++) {
     if (expression.charAt(i) == '+' || expression.charAt(i) == '-' || expression.charAt(i) == '*') {
         list.add(expression.substring(start, i));
         list.add(expression.charAt(i) + ""); //String으로 변경
         start = i + 1;
     }
 }
 list.add(expression.substring(start));

 

 

3.for문을 돌 때 우선 순위로 계산 된 것은 제거 해야하기 때문에 remove한다.

예를 들어, "100-200*6+100" 인 상황에서 *가 우선 순위라면 

k = 3 중심으로 k=2,3,4가 계산되고 그 계산 값은 k=2가 되고 k=3,4를 remove해야 "100-1200+100" 이런식으로 줄어든 수식에 대한 배열을 정의할 수 있다.(ArrayList를 쓴 이유)

 for (int i = 0; i < op.length; i++) {
     ArrayList<String> sub_list = new ArrayList<String>(list);
     for (int j = 0; j < 3; j++) {
         for (int k = 0; k < sub_list.size(); k++) {
             if (op[i][j].equals(sub_list.get(k))) {
                 sub_list.set(k - 1, calculate(sub_list.get(k - 1), sub_list.get(k), sub_list.get(k + 1)));
                 sub_list.remove(k);
                 sub_list.remove(k);
                 k--;
             }
         }
     }
     answer = Math.max(answer, Math.abs(Long.parseLong(sub_list.get(0))));
 }

 

 


[최종 코드]

import java.util.ArrayList;

class Solution {
    public long solution(String expression) {
        long answer = 0;

        String op[][] = {{"+","-","*"},{"+","*","-"},{"-","+","*"},{"-","*","+"},{"*","-","+"},{"*","+","-"}};

        ArrayList<String> list = new ArrayList<String>();

        int start = 0;
        for(int i=0;i<expression.length();i++){
            if(expression.charAt(i) == '+' || expression.charAt(i) == '-' || expression.charAt(i) == '*'){
                list.add(expression.substring(start,i));
                list.add(expression.charAt(i)+""); //String으로 변경
                start = i+1;
            }
        }
        list.add(expression.substring(start));

        for(int i = 0 ; i<op.length;i++){
            ArrayList<String> sub_list = new ArrayList<String>(list);
            for(int j = 0; j<3;j++){
                for (int k = 0; k < sub_list.size(); k++) {
                    if (op[i][j].equals(sub_list.get(k))) {
                        sub_list.set(k - 1, calculate(sub_list.get(k - 1), sub_list.get(k), sub_list.get(k + 1)));
                        sub_list.remove(k);
                        sub_list.remove(k);
                        k--;
                    }
                }
            }
            answer = Math.max(answer, Math.abs(Long.parseLong(sub_list.get(0))));
        }

        return answer;
    
    }
    
    
    public  String calculate(String num1, String oper, String num2){
        long n1 = Long.parseLong(num1);
        long n2 = Long.parseLong(num2);

        if(oper.equals("+")){
            return n1 + n2 + "";
        }else if(oper.equals("-")){
            return n1 - n2 + "";
        }else{
            return n1 * n2 + "";
        }
    }
}