Skip to content

Commit e3b68c3

Browse files
committed
[Personal] PGM: 수식 최대화
1 parent 9090491 commit e3b68c3

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import java.util.*;
2+
class Solution {
3+
public long solution(String expression) {
4+
List<String> list = toList(expression); //리스트로 분리
5+
6+
//우선순위별 계산
7+
String[] prior = {"*-+", "*+-", "+-*", "+*-", "-*+", "-+*"};
8+
long answer = 0;
9+
for (String p : prior) {
10+
answer = Math.max(getResult(list, p), answer); //해당 우선순위로 계산했을 때의 결과로 최댓값 찾기
11+
}
12+
return answer;
13+
}
14+
15+
long getResult(List<String> list, String p) {
16+
Deque<String> dq = new ArrayDeque<>();
17+
for (int i = 0; i < list.size(); i++) { //리스트로 덱 초기화
18+
dq.offerLast(list.get(i));
19+
}
20+
dq.offerLast("last"); //마지막 원소임을 표시
21+
22+
int pi = 0;
23+
char op = '.'; //.으로 초기화
24+
while (pi < 3) {
25+
String val = dq.pollFirst();
26+
27+
if (val.equals("last")) { //마지막 원소일 경우
28+
pi++;
29+
if (dq.size() == 1) { //1개만 남았을 경우 최종 결과 반환
30+
return Math.abs(Long.parseLong(dq.pollLast()));
31+
}
32+
dq.offerLast("last");
33+
continue;
34+
}
35+
36+
if (op != '.') { //계산
37+
long num1 = Long.parseLong(dq.pollLast());
38+
long num2 = Long.parseLong(val);
39+
long result = calculate(num1, num2, op);
40+
dq.offerLast(String.valueOf(result)); //연산 결과 삽입
41+
op = '.';
42+
continue;
43+
}
44+
45+
if (val.charAt(0) == p.charAt(pi)) { //우선순위에 해당하는 연산자라면
46+
op = val.charAt(0);
47+
} else {
48+
dq.offerLast(val);
49+
}
50+
}
51+
52+
return 0;
53+
}
54+
55+
long calculate(long num1, long num2, char op) {
56+
if (op == '*') {
57+
return num1 * num2;
58+
} else if (op == '+') {
59+
return num1 + num2;
60+
} else {
61+
return num1 - num2;
62+
}
63+
}
64+
65+
List<String> toList(String expression) {
66+
List<String> list = new ArrayList<>();
67+
StringBuilder sb = new StringBuilder();
68+
for (int i = 0; i < expression.length(); i++) {
69+
char c = expression.charAt(i);
70+
if (!Character.isDigit(c)) { //연산자라면
71+
list.add(sb.toString());
72+
sb = new StringBuilder();
73+
list.add(String.valueOf(c));
74+
} else {
75+
sb.append(c);
76+
}
77+
}
78+
list.add(sb.toString());
79+
return list;
80+
}
81+
}

0 commit comments

Comments
 (0)