알고리즘왕/Programmers

[프로그래머스/JAVA] 수식 최대화

찌 ㅋ 2021. 5. 4. 00:08

풀이

  1. 연산자가 세가지 뿐이기 때문에 6가지의 경우의 수를 미리 배열에 만들어놓음
  2. 연산자를 기준으로 string tokenizer로 분리
    • return delims를 true로 설정하여 연산자도 반환되게 함
  3. 6가지 경우에 수에 대하여 계산
    1. 우선순위 순서대로 계산
    2. 현재 연산자와 동일한 연산자일 때만 stack에서 하나 꺼내고 list에서 다음 피연산자를 꺼내와 계산
    3. 결과를 다시 stack에 넣음
더보기
package KakaoIntern2020.P67257_수식최대화;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;

public class Solution {

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

		List<String> exp = new ArrayList<>();
		StringTokenizer st = new StringTokenizer(expression, "*+-", true);
		while (st.hasMoreTokens()) {
			exp.add(st.nextToken());
		}

		String[] priority = { "*+-", "*-+", "+*-", "+-*", "-*+", "-+*" };
		for (int p = 0; p < priority.length; p++) {
			List<String> from = copy(exp);
			for (int op = 0; op < 3; op++) {
				if (from.size() == 1)
					break;
				String cur = priority[p].charAt(op) + "";
				Stack<String> stack = new Stack<>();
				for (int i = 0; i < from.size(); i++) {
					if (cur.equals(from.get(i))) {
						String first = stack.pop();
						String second = from.get(++i);
						stack.push(calc(cur, first, second));
						continue;
					}
					stack.add(from.get(i));
				}
				from = new ArrayList<>(stack);
			}
			long value = Long.parseLong(from.get(0));
			value = value < 0 ? -value : value;
			answer = Math.max(answer, value);
		}

		return answer;
	}

	private static String calc(String cur, String first, String second) {
		long f = Long.parseLong(first);
		long s = Long.parseLong(second);
		long result = 0L;
		switch (cur) {
		case "+":
			result = f + s;
			break;
		case "-":
			result = f - s;
			break;
		case "*":
			result = f * s;
			break;

		}
		return result + "";
	}

	private static List<String> copy(List<String> exp) {
		List<String> copied = new ArrayList<>();
		for (int i = 0; i < exp.size(); i++) {
			copied.add(exp.get(i));
		}
		return copied;
	}

	public static void main(String[] args) {
		System.out.println(solution("100-200*300-500+20"));
		System.out.println(solution("50*6-3*2"));
	}

}