- 난이도: Lv2
프로그래머스 링크: https://school.programmers.co.kr/learn/courses/30/lessons/67257
풀이 링크(GitHub): hayannn/CodingTest_Java/프로그래머스/2/수식 최대화
풀이 시간 : 42분
+
, -
, *
중)import java.util.*;
class Solution {
String[] operators = {"+", "-", "*"};
long maxAnswer = 0;
public long solution(String expression) {
List<Long> numList = new ArrayList<>();
List<String> opList = new ArrayList<>();
parseExpression(expression, numList, opList);
List<String> existOperators = new ArrayList<>();
for (String op : operators) {
if (expression.contains(op)) existOperators.add(op);
}
permuteOperators(existOperators, new boolean[existOperators.size()], new ArrayList<>(), numList, opList);
return maxAnswer;
}
private void parseExpression(String expr, List<Long> numList, List<String> opList) {
int idx = 0;
for (int i = 0; i < expr.length(); i++) {
char ch = expr.charAt(i);
if (ch == '+' || ch == '-' || ch == '*') {
numList.add(Long.parseLong(expr.substring(idx, i)));
opList.add(String.valueOf(ch));
idx = i + 1;
}
}
numList.add(Long.parseLong(expr.substring(idx)));
}
private void permuteOperators(List<String> ops, boolean[] visited, List<String> path,
List<Long> numList, List<String> opList) {
int n = ops.size();
if (path.size() == n) {
long result = calculate(new ArrayList<>(numList), new ArrayList<>(opList), path);
maxAnswer = Math.max(maxAnswer, Math.abs(result));
return;
}
for (int i = 0; i < n; i++) {
if (visited[i]) continue;
visited[i] = true;
path.add(ops.get(i));
permuteOperators(ops, visited, path, numList, opList);
path.remove(path.size() - 1);
visited[i] = false;
}
}
private long calculate(List<Long> nums, List<String> ops, List<String> priority) {
for (String op : priority) {
for (int i = 0; i < ops.size(); ) {
if (ops.get(i).equals(op)) {
long res = apply(nums.remove(i), nums.remove(i), op);
nums.add(i, res);
ops.remove(i);
continue;
}
i++;
}
}
return nums.get(0);
}
private long apply(long a, long b, String op) {
if (op.equals("+")) return a + b;
if (op.equals("-")) return a - b;
return a * b;
}
}