ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 수식 최대화 (2020 카카오 인턴십)
    ALGORITHM/PROGRAMMERS 2021. 3. 15. 21:49

    programmers.co.kr/learn/courses/30/lessons/67257

     

    코딩테스트 연습 - 수식 최대화

    IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과

    programmers.co.kr

    2021-03-15


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    import java.util.ArrayList;
     
    public class Solution67257 {
        public static long answer;
        public static int[] order;
        public static boolean[] vtd;
        public static ArrayList<String> list;
        public static String[] dir = {"*""+""-"};
        public static void solve(int[] order) {
            ArrayList<String> temp = new ArrayList<>(list);
            for (int value : order) { // 만들 수 있는 기호의 조합 순서대로
                for (int j = 0; j < temp.size(); j++) {
                    if (temp.get(j).equals(dir[value])) { // 우선순위에 있는 기호를 만나게 되면 기호 기준 전과 후의 값으로 계산
                        long tmp = 0;
                        switch (dir[value]) {
                            case "*":
                                tmp = Long.parseLong(temp.get(j - 1)) * Long.parseLong(temp.get(j + 1));
                                break;
                            case "-":
                                tmp = Long.parseLong(temp.get(j - 1)) - Long.parseLong(temp.get(j + 1));
                                break;
                            case "+":
                                tmp = Long.parseLong(temp.get(j - 1)) + Long.parseLong(temp.get(j + 1));
                                break;
                        }
                        for (int k = 0; k < 3; k++) {
                            temp.remove(j - 1);
                        }
                        temp.add(j - 1String.valueOf(tmp));
                        j = 0;
                    }
                }
            }
            answer = Math.max(answer, Math.abs(Long.parseLong(temp.get(0))));
        }
     
        public static void comb(int cnt) { // 기호로 만들어 낼 수 있는 모든 조합 (3!)
            if(cnt == dir.length) {
                solve(order);
                return;
            }
     
            for(int i = 0; i < dir.length; i++) {
                if(!vtd[i]) {
                    vtd[i] = true;
                    order[cnt] = i;
                    comb(cnt+1);
                    vtd[i] = false;
                }
            }
        }
        public static long solution(String expression) {
            answer = 0;
            list = new ArrayList<>();
            String str = "";
            vtd = new boolean[3];
            for(int i = 0; i < expression.length(); i++) { // 숫자와 기호 분리해서 arraylist에 추
                if(expression.charAt(i) == '*' || expression.charAt(i) == '+' || expression.charAt(i) == '-') {
                    list.add(str);
                    list.add(String.valueOf(expression.charAt(i)));
                    str = "";
                } else {
                    str += expression.charAt(i);
                }
            }
            order = new int[3];
            list.add(str);
            comb(0);
            return answer;
        }
     
        public static void main(String[] args) {
            String s = "100-200*300-500+20";
            System.out.println(solution(s));
        }
    }
     
    cs

    #문제풀이

    단순히 만들 수 있는 기호의 우선순위 조합을 이용해서 그 경우의 수에 맞추서 계산 해보면 되는 문제이다.

     

     

    댓글

Programming Diary