반응형
문제분석
설명이 길다. 요약하자면, +,-,*연산의 우선순위를 변경해서 최대로 나오는 절댓값 수식을 계산하면된다.
//만약 나눗셈까지 포함되어있었으면 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 |
반응형
'알고리즘 > 프로그래머스 Level2' 카테고리의 다른 글
[프로그래머스,자바] Level2: 괄호 회전하기 (0) | 2021.11.07 |
---|---|
[프로그래머스,자바] Level2: 튜플 (0) | 2021.11.06 |
[프로그래머스,Java] Level2: 거리두기 확인하기 (0) | 2021.11.03 |
[프로그래머스,자바] Level2: 뉴스 클러스터링 (0) | 2021.11.03 |
[프로그래머스,Java] Level2:괄호 변환 (0) | 2021.11.02 |