유블로그

[프로그래머스] 수식 최대화 본문

알고리즘

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

yujeong kang 2021. 1. 22. 00:11

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

 

소요시간 : 1시간 26분

 

아 너무 힘들군

처음에 그냥 string 으로 하다가 마이너스 같은 것들 때문인지 제시된 테케만 맞고

제출하면 반 정도는 틀렸다.

 

에러를 고치느라 한 시간이 훌쩍 넘어서

그냥 약간 힌트를 보고

결국엔 그냥 코드를 다시 짰는데

List 로 숫자와 연산자를 나눠서 계산했다.

찾은 연산자 인덱스가 1이라면

숫자 List 인덱스 1과 2의 값을 연산하면 되고,

연산자 List에서는 인덱스 1을 remove한다.

마지막에 남은 numList.get(0) 으로 MAX를 갱신한다.

 

값은 항상 Long 으로!

 

이 방법으로 하니 거의 10~20분만에 할 수 있었다. 휴........................................................................................

import java.util.ArrayList;
import java.util.List;

class Solution {
	int[] numbers = new int[3];
	boolean[] selected = new boolean[3];
	char[] operators = {'*', '+', '-'};
    public long solution(String expression) {
        permu(0, expression);
        
        return answer;
    }
    
    long answer = 0;
    void permu(int cnt, String expression) {
    	if(cnt == 3) {
        	List<Long> numList = new ArrayList<>();
        	List<Character> operList = new ArrayList<>();
        	
        	for (int i = 0; i < expression.length(); i++) {
				if(expression.charAt(i) == '+' || expression.charAt(i) == '-' || expression.charAt(i) == '*') operList.add(expression.charAt(i));
				else {
					int j = i;
					while(true) {
						if(j == expression.length()) break;
						if(expression.charAt(j) == '+' || expression.charAt(j) == '-' || expression.charAt(j) == '*') break;
						j++;
					}
					numList.add(Long.parseLong(expression.substring(i, j)));
					i = j-1;
				}
			}
        	
        	for (int i = 0; i < 3; i++) {
				for (int j = 0; j < operList.size(); j++) {
					if(operList.get(j) == operators[numbers[i]]) {
		        		Long tot = (long) 0;
		        		switch(operators[numbers[i]]) {
						case '*':
							tot = numList.get(j) * numList.get(j+1); 
							break;
						case '+':
							tot = numList.get(j) + numList.get(j+1); 
							break;
						case '-':
							tot = numList.get(j) - numList.get(j+1); 
							break;
						}
		        		numList.remove(j+1);
		        		numList.set(j, tot);
		        		operList.remove(j);
		        		j = -1;
					}
				}
			}
        	
        	if(answer < Math.abs(numList.get(0))) answer = Math.abs(numList.get(0));
    		return;
    	}
    	
    	for (int i = 0; i < 3; i++) {
			if(selected[i]) continue;
			selected[i] = true;
			numbers[cnt] = i;
			permu(cnt+1, expression);
			selected[i] = false;
		}
    }
}