프로그래머스/LEVEL 2

수식 최대화

GenieLove! 2021. 6. 6. 16:10
728x90
반응형

Java

import java.util.*;
import java.lang.*;
class Solution {
    List<String[]> list;
    public long solution(String expression) {
        list = new ArrayList<>();
        List<String> operator = new ArrayList<>();
        operator.add("*");operator.add("+");operator.add("-");
        makeOrderList(operator, new ArrayList<>());//*+- 순열 조합 완료
        long answer = 0;
        for(int i = 0; i < list.size(); i++){//연산 순서
            String exp1 = expression;
            for(int o = 0; o < list.get(i).length; o++){
                exp1 = operatorMethod(exp1, list.get(i)[o]);
                if(isNumber(exp1)) break;
            }
            
            if(Math.abs(Long.parseLong(exp1)) > answer) answer = Math.abs(Long.parseLong(exp1));
        }
        
        return answer;
    }
    
    private void makeOrderList(List<String> operator, List<String> ordered){
        if(operator.size() == 1){
            
            ordered.add(operator.get(0));
            String[] str = new String[ordered.size()];
            for(int i = 0; i < str.length; i++)
                str[i] = ordered.get(i);
            list.add(str);
            return;
        }
        
        for(int i = 0; i < operator.size(); i++){
            List<String> copy = new ArrayList<>(ordered);
            List<String> copyOper = new ArrayList<>(operator);
            copy.add(operator.get(i));
            copyOper.remove(i);
            makeOrderList(copyOper, copy);
        }
    }
    
    private String operatorMethod(String str, String operator){
        String[] splitStr = str.split("\\" + operator);
        String result = "";
        if(splitStr.length == 1) return str;
        
        for(int i = 0; i < splitStr.length - 1; i++){
            long before = 0;
            long after = 0;
            for(int f = splitStr[i].length() - 1; f >= 0; f--){
                if(f == 0){
                    before = Long.parseLong(splitStr[i]);
                    splitStr[i] = "";
                    break;
                }
                if(!isNumber(splitStr[i].substring(f, f + 1))){
                	if(((f - 1 >= 0 && !isNumber(splitStr[i].substring(f - 1, f))) || f == 0)
                		&& (i > 0 && !isNumber(splitStr[i - 1]))){//음수일 때
                		f = f - 1;
                	}
                    before = Long.parseLong(splitStr[i].substring(f + 1, splitStr[i].length()));
                    splitStr[i] = splitStr[i].substring(0, f + 1);
                    break;
                }
            }
            for(int f = 0; f < splitStr[i + 1].length(); f++){
                if((f == splitStr[i + 1].length() - 1 && isNumber(splitStr[i + 1].substring(f, f + 1)))
                	&& (!isNumber(splitStr[i]))){
                    after = Long.parseLong(splitStr[i + 1]);
                    splitStr[i + 1] = numberOperator(before, after, operator);
                    break;
                }
                if(!isNumber(splitStr[i + 1].substring(f, f + 1)) && f != 0){
                    after = Long.parseLong(splitStr[i + 1].substring(0, f));
                    splitStr[i + 1] = numberOperator(before, after, operator) + splitStr[i + 1].substring(f, splitStr[i + 1].length());
                    break;
                }
            }
            
            result += splitStr[i];
            
        }
        result += splitStr[splitStr.length - 1];
        return result;
    }
    
    private boolean isNumber(String number){
        try{
            Long.parseLong(number);
            return true;
        }catch(Exception e){
            return false;
        }
    }
    
    private String numberOperator(long before, long after, String operator){
        switch(operator){
            case "*": return String.valueOf(before * after);
            case "+": return String.valueOf(before + after);
            case "-": return String.valueOf(before - after);
        }
        return "";
    }
}

Python

import itertools
def solution(expression):
    answer = 0
    operator = ("*", "+", "-")
    operatorList = list(itertools.permutations(operator))
    
    for i in range(len(operatorList)):
        exp1 = expression
        for o in range(len(operatorList[i])):
            exp1 = operatorMethod(exp1, operatorList[i][o])
            
            if exp1.isdigit(): break
        
        if abs(int(exp1)) > answer: answer = abs(int(exp1))
        
    return answer

def operatorMethod(string, operator):
    splitStr = string.split(operator)
    result = ""
    if len(splitStr) == 1: return string
    
    for i in range(0, len(splitStr) - 1):
        before, after = 0, 0
        for f in range(len(splitStr[i]) - 1, 0 - 1, -1):
            if f == 0:
                before = int(splitStr[i])
                splitStr[i] = ""
                break
            if not splitStr[i][f:f + 1].isdigit():
                if ((f - 1 >= 0 and (not splitStr[i][f - 1:f].isdigit()) or f == 0) and (i > 0 and (not splitStr[i - 1].isdigit()))):
                    f = f - 1
                before = int(splitStr[i][f + 1:]);
                splitStr[i] = splitStr[i][0:f + 1]
                break
    
        for f in range(0, len(splitStr[i + 1])):
            if (f == len(splitStr[i + 1]) - 1 and splitStr[i + 1][f:f + 1].isdigit()) and not splitStr[i].isdigit():
                after = int(splitStr[i + 1])
                splitStr[i + 1] = numberOperator(before, after, operator)
                break
            if (not splitStr[i + 1][f:f + 1].isdigit()) and f != 0:
                after = int(splitStr[i + 1][0:f])
                splitStr[i + 1] = numberOperator(before, after, operator) + splitStr[i + 1][f:]
                break
                
        result += splitStr[i]
    
    result += splitStr[-1]
    return result


def numberOperator(before, after, operator):
    if operator == "*": return str(before * after)
    if operator == "+": return str(before + after)
    if operator == "-": return str(before - after)
728x90
반응형

'프로그래머스 > LEVEL 2' 카테고리의 다른 글

거리두기 확인하기  (0) 2022.02.17
타겟 넘버  (0) 2021.12.19
튜플  (0) 2021.06.03
행렬 테두리 회전하기  (0) 2021.05.30
게임 맵 최단거리  (0) 2021.05.27