본문 바로가기
Problem-solving/프로그래머스

프로그래머스 - (2020 카카오 인턴십) 수식 최대화 (Java)

by taehee.kim.dev 2020. 11. 23.

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

 

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

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

programmers.co.kr

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;

class Solution {

    private final ArrayList<char[]> cases = new ArrayList<>() {
        {
            add(new char[]{'+', '-', '*'});
            add(new char[]{'+', '*', '-'});
            add(new char[]{'*', '+', '-'});
            add(new char[]{'*', '-', '+'});
            add(new char[]{'-', '+', '*'});
            add(new char[]{'-', '*', '+'});
        }
    };

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

        ArrayList<String> splitStr = this.getSplitStr(expression);

        for (char[] oneCase : this.cases) {
            answer = Math.max(answer, Math.abs(this.getResult(oneCase, splitStr)));
        }

        return answer;
    }

    private long getResult(char[] oneCase, ArrayList<String> splitStr) {
        Deque<String> before = new ArrayDeque<>();
        Deque<String> after = new ArrayDeque<>();
        for (String s : splitStr) {
            after.addLast(s);
        }
        for (char operator : oneCase) {
            before = new ArrayDeque<>(after);
            after.clear();
            while (!before.isEmpty()) {
                String curValue = before.pollFirst();
                if (curValue.equals(String.valueOf(operator))) {
                    String beforeNum = after.pollLast();
                    String afterNum = before.pollFirst();
                    switch (operator) {
                        case '+':
                            after.addLast(String
                                .valueOf(Long.parseLong(beforeNum) + Long.parseLong(afterNum)));
                            break;
                        case '-':
                            after.addLast(String
                                .valueOf(Long.parseLong(beforeNum) - Long.parseLong(afterNum)));
                            break;
                        case '*':
                            after.addLast(String
                                .valueOf(Long.parseLong(beforeNum) * Long.parseLong(afterNum)));
                            break;
                    }
                } else {
                    after.addLast(curValue);
                }
            }
        }
        return after.stream().mapToLong(Long::parseLong).sum();
    }

    private ArrayList<String> getSplitStr(String expression) {
        ArrayList<String> splitStr = new ArrayList<>();
        String numPart = "";
        for (int i = 0; i < expression.length(); i++) {
            if (expression.charAt(i) == '+' ||
                expression.charAt(i) == '-' ||
                expression.charAt(i) == '*') {
                splitStr.add(numPart);
                splitStr.add(String.valueOf(expression.charAt(i)));
                numPart = "";
            } else {
                numPart += expression.charAt(i);
            }
        }
        splitStr.add(numPart);
        return splitStr;
    }
}

댓글