알고리즘/프로그래머스 Level2

[프로그래머스,Java] Level2: 수식 최대화

류창 2021. 11. 4. 21:28
반응형

 

문제분석

 

설명이 길다. 요약하자면, +,-,*연산의 우선순위를 변경해서 최대로 나오는 절댓값 수식을 계산하면된다.

//만약 나눗셈까지 포함되어있었으면 24가지.... 나눗셈이빠져서 그나마 6가지다.

 

하여튼 이문제도, 완전탐색을 돌려야한다. 모든 경우 우선순위 연산을 해보고 Max값을 뽑아야한다.

 

이 문제는 경우의수가 딱 6개다.  *+-,*-+,+*-,+-*,-*+,-+* 단 6가지  

 

따라서, 하나씩 Case를 분류해서 하기로 했다. 

->만약 나눗셈까지포함해서 24가지였으면, 순열 알고리즘을사용했을것같다.

 

 

문제에서 연산식을 문자열로준다. (expression)

 

하나의 문자열 덩어리로 입력을 받았기에, 숫자와 연산식을 분간하려면 Split 해주는게 편하다.

 

-> 숫자만 담은 리스트 numbers

-> 연산자만 담은 리스트 signs

 

그리고 우선순위 계산을 해줄 cases 메소드 작성한다.

그후, 6개의 케이스를 연산한다.

 

*이면 곱셈연산 multiple

+이면 플러스연산 plus

-이면 마이너스연산 minus

 

 

문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import java.util.*;
class Solution { 
List<String> num_list = new LinkedList<>();
List<String> sign_list= new LinkedList<>();
    public long solution(String expression) {
        long[] answer = new long[6]; //*+-,*-+,+*-,+-*,-*+,-+* 단 6가지 모든 경우 계산
        
        //숫자만 분리
        String[] numbers=expression.split("[-*+]");
        //연산자만 분리
        String[] sign=expression.replaceAll("[0-9]","").split("");
        reset(numbers,sign);     
        //Case 1
        answer[0]=cases(num_list,sign_list,"*","-","+");  
        reset(numbers,sign);
        //Case2
        answer[1]=cases(num_list,sign_list,"*","+","-");
        reset(numbers,sign);
        //Case3
        answer[2]=cases(num_list,sign_list,"+","*","-");
        reset(numbers,sign);
        //Case4
        answer[3]=cases(num_list,sign_list,"+","-","*");
        reset(numbers,sign);
        //Case5
        answer[4]=cases(num_list,sign_list,"-","*","+");
        reset(numbers,sign);
        //Case6
        answer[5]=cases(num_list,sign_list,"-","+","*");
        Arrays.sort(answer);
        
        return answer[5];
    }
    //하나의 Case를 완료하면 초기화 시킴
    public void reset(String[] numbers,String[] sign){
        num_list.clear();
        for(String data:numbers){
            num_list.add(data);
        }
        for(String data:sign){
            sign_list.add(data);
        }
    }
    
    //우선순위에따라 계산해주기
    public static long cases (List<String> num_list,List<String> sign_list,String a,String b,String c){
        
        if(a.equals("*")){
            multiple(num_list,sign_list);
        }
        else if(a.equals("+")){
            plus(num_list,sign_list);
        }
        else{
            minus(num_list,sign_list);
        }
        
        if(b.equals("*")){
            multiple(num_list,sign_list);
        }
        else if(b.equals("+")){
            plus(num_list,sign_list);
        }
        else{
            minus(num_list,sign_list);
        }
        
        if(c.equals("*")){
            multiple(num_list,sign_list);
        }
        else if(c.equals("+")){
            plus(num_list,sign_list);
        }
        else{
            minus(num_list,sign_list);
        }
        
        return Math.abs(Long.parseLong(num_list.get(0)));
    }
    //곱셈연산
    public static void multiple  (List<String> num_list,List<String> sign_list){
        
         for(int i=0;i<sign_list.size();i++){
            if(sign_list.get(i).equals("*")){
                num_list.set(i,Long.toString(Long.parseLong(num_list.get(i))*Long.parseLong(num_list.get(i+1))));
                num_list.remove(i+1);
                sign_list.remove(i);
                i--;
            }
        }
        return;
    }
    //플러스연산
    public static void plus (List<String> num_list,List<String> sign_list){
        for(int i=0;i<sign_list.size();i++){
            if(sign_list.get(i).equals("+")){
                num_list.set(i,Long.toString(Long.parseLong(num_list.get(i))+Long.parseLong(num_list.get(i+1))));
                num_list.remove(i+1);
                sign_list.remove(i);
                i--;
            }
        }
    }
    //마이너스 연산
    public static void minus (List<String> num_list,List<String> sign_list){     
         for(int i=0;i<sign_list.size();i++){
            if(sign_list.get(i).equals("-")){
                num_list.set(i,Long.toString(Long.parseLong(num_list.get(i))-Long.parseLong(num_list.get(i+1))));
                num_list.remove(i+1);
                sign_list.remove(i);
                i--;
            }
        }
    }
}
cs
반응형