ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 수식 최대화
    프로그래머스 알고리즘 2023. 11. 22. 23:10
    728x90

    문제

     

    프로그래머스

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

    programmers.co.kr

    수식이 주어지면, 연산자의 우선순위를 임의를 바꿔 최댓값을 구하는 문제이다.

    예를 들어 "100-200*300-500+20" 식이 주어지면, * > + > - 순서로 연산자의 우선순위를 정해주면

    100-200*300-500+20
    100-(200*300)-500+20
    100-60000-(500+20)
    (100-60000)-520
    (-59900-520)
    -60420

    음수의 결과값은 절댓값을 취해준다.

     

    연산자는 총 "*", "+", "-" 3가지가 나온다.


    먼저 연산자 순위의 모든 경우의 수를 만들어준다.

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

     

    그 다음 주어진 expression을 연산자와 숫자를 분리해 List에 저장해준다.

    List<String>list = new ArrayList<>();
            int start = 0;
            for(int i = 0; i< expression.length();i++){
                char ch = expression.charAt(i);
                if(ch == '-' || ch == '+' || ch=='*'){
                    list.add(expression.substring(start, i));//숫자 추가
                    list.add(ch+"");//연산자 추가
                    start = i+1;
                }
            }
            list.add(expression.substring(start)); //마지막 숫자 추가

     

    그 다음 우선순위에 따라 list를 순회하면서 연산자를 만나면 계산해준다.

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

    .set(i, j) 는 i번째 인덱스를 j로 대체하는 함수이다.

    해당 연산자가 나오면 연산자 기준 양 옆에 있는 숫자를 계산 해주고, subList의 이전 element를 삭제한다.

    계산된 element는 j-1에 위치해 있기 때문이다.

    모든 연산자가 순회하고 계산이  다된 숫자는 subList의 0번째 인덱스에 위치한다.

     

    cal() 의 코드이다.

    static String cal(String num1, String op, String num2){
            long n1 = Long.parseLong(num1);
            long n2 = Long.parseLong(num2);
            
            if(op.equals("+"))
                return n1 + n2 +"";
            else if(op.equals("-"))
                return n1 - n2 + "";
            
            return n1 * n2 +"";
        }

    전체 코드이다.

    import java.util.*;
    class Solution {
        public long solution(String expression) {
            long answer = -1;
            String op[][] ={ { "+", "-", "*" }, { "+", "*", "-" }, { "-", "*", "+" },  { "-", "+", "*" }, { "*", "-", "+" }, { "*", "+", "-" } };
            
            List<String>list = new ArrayList<>();
            int start = 0;
            for(int i = 0; i< expression.length();i++){
                char ch = expression.charAt(i);
                if(ch == '-' || ch == '+' || ch=='*'){
                    list.add(expression.substring(start, i));//숫자 추가
                    list.add(ch+"");//연산자 추가
                    start = i+1;
                }
            }
            list.add(expression.substring(start)); //마지막 숫자 추가
            
            for(int i = 0;i<op.length;i++){
                List<String>subList = new ArrayList<String>(list);
                for(int k = 0;k<3;k++){
                    for(int j = 0;j<subList.size();j++){
                        if(op[i][k].equals(subList.get(j))){
                            subList.set(j-1, cal(subList.get(j-1), subList.get(j), subList.get(j+1)));
                            subList.remove(j);
                            subList.remove(j);
                            j--;
                        }
                    }
                }
                answer = Math.max(answer, Math.abs(Long.parseLong(subList.get(0))));
            }
            return answer;
        }
        static String cal(String num1, String op, String num2){
            long n1 = Long.parseLong(num1);
            long n2 = Long.parseLong(num2);
            
            if(op.equals("+"))
                return n1 + n2 +"";
            else if(op.equals("-"))
                return n1 - n2 + "";
            
            return n1 * n2 +"";
        }
    }

    '프로그래머스 알고리즘' 카테고리의 다른 글

    코딩 테스트 공부  (0) 2023.11.25
    표 편집  (1) 2023.11.24
    징검다리 건너기  (1) 2023.11.21
    과일로 만든 아이스크림 고르기 Oracle  (0) 2023.11.07
    주식가격 JAVA  (0) 2023.10.21
Designed by Tistory.