package org.example;
import java.util.Arrays;
public class Calc {
public static int run(String exp) {
boolean needToMulti = exp.contains("*");
boolean needToPlus = exp.contains("+");
boolean needTole = exp.contains("(");
boolean needToCompound = needToPlus && needToMulti;
if (needToCompound) {
int a;
int b;
int sum = 0;
String[] bits = exp.split(" \\+ ");
for (int i = 0; i < bits.length; i++) {
if (bits[i].contains("*")) {
a = run(bits[i]);
System.out.println("a=" + a);
sum += a;
} else {
b = Integer.parseInt(bits[i]);
System.out.println("b=" + b);
sum += b;
}
System.out.println("sum=" + sum);
}
return sum;
}
if (needToMulti) {
String[] bits = exp.split(" \\* ");
int sum = 1;
for (int i = 0; i < bits.length; i++) {
sum *= Integer.parseInt(bits[i]);
}
return sum;
} else {
exp = exp.replace("- ", "+ -");
if (needTole) {
exp = exp.replace("(", "");
exp = exp.replace(")", "");
String[] bits = exp.split(" \\+ ");
int sum = 0;
for (int i = 0; i < bits.length; i++) {
sum += Integer.parseInt(bits[i]);
System.out.println("sum=" + sum);
}
return sum;
}
else {
String[] bits = exp.split(" \\+ ");
int sum = 0;
for (int i = 0; i < bits.length; i++) {
sum += Integer.parseInt(bits[i]);
}
return sum;
}
}
}
}
이 문제의 풀이 방법의 핵심은 replace를 얼마나 활용하는가. 나는 이렇게 생각했어. 나는 또 뒤에 생각은 안하고 이 문제만 해결해야한다는 생각으로 풀었어.
- 먼저 경우의 수를 또 생각해서 exp문자열안에 '('가 있는경우를 또 만들었어 그런다음에 replace로 공백을 제거해
- +로 split해서 배열에 넣은다음 for문을 이용해 배열을 돌면서 더한값을 sum에 넣어. 음.. 그러면 될거야.
- 그래서 단순이 소괄호가 몇개가 있던 제거를 해서 연산을 하는거야 하지만 + 말고 다른 연산자가 있으면 다른 방법을 생각해 봐야할것같아.
- 점점 이 과제를 해결하면서 물론 어렵지만 효율성없고 안좋은코드로 내가 짜는게 느껴진다.. 근데 이거 말고는 방법을 아직 모르겠어 흑흑
이거는 말이지.. 괄호와 *를 같이 있는 경우를 추가했어.
밑에를 보면 알겠지만 needToCompound&&needTole 이 부분이 왜 if조건에 있냐면 이 조건이 거짓일때 else if로 넘어가게 하려고 일부러 맨 처음으로 놨어.
if (needToCompound&&needTole) {
int a;
int b = 0;
exp = exp.replace("(", "");
exp = exp.replace(")", "");
String[] bits = exp.split(" \\* ");
for (int i = 0; i < bits.length; i++) {
if (bits[i].contains("+")) {
String[] arr = bits[i].split(" \\+ ");
for (int j = 0; j < arr.length; j++) {
b += Integer.parseInt(arr[j]);
}
} else {
a = run(bits[i]);
System.out.println("a=" + a);
b *= a;
}
}
return b;
}
이렇게만 추가해줬는데
- 나는 먼저 소괄호들을 제거 하고 시작했어.그럼 10+20*3이 되겠지
- 그리고 * 로 나눴는데 그러면 10+20/ 3이 나올거잖아? 그러면 먼저 10+20을 계산하도록 내가 만드는거야.
- 그래서 for문을 돌아 bits의 길이만큼 그리고 만약 bits[i]에 +가 포함되어있다면 String arr[] 배열을 만들어 거기에 +로 나눈 값들을 넣는거지 그럼 10,20이 나눠서 들어갈거야.
- 그럼 Integer.pareInt해가지고 정수로 변환해서 b에다가 더한 값을 저장해
- 그리고 +가 포함되어있지않다! 이러면 run(bits[i])를 해서 a에 값을 넣자.
- 그 다음에 아까 저장한 b의 값이랑 a랑 더해서 다시 b에 넣고 b를 return하면 끝!@!